Une variable en ligne peut-elle être modifiée après l'initialisation en C ++ 17?

11

Mon scénario est le suivant (cela a fonctionné en clang mais pas en gcc)

liba.hpp:

inline int MY_GLOBAL = 0;

libother.cpp: (dll)

#include "myliba.hpp"

void myFunc() {
    //
    MYGLOBAL = 28;
}

someexe.cpp:

RunAppThatUsesBothLibAandLibOther();

Le problème est que la variable en ligne affichait 0 aux endroits où je m'attendais à 28 car elle a déjà été modifiée au moment de l'exécution. MSVC n'est pas d'accord avec cela, mais clang fait la chose à laquelle je m'attendais.

La question est: les variables en ligne peuvent-elles être modifiées au moment de l'exécution dans mon scénario? (J'ai résolu le problème en supprimant la variable.)

Germán Diago
la source

Réponses:

10

Oui, les inlinevariables peuvent être modifiées après l'initialisation.

Cependant, les DLL sont des choses étranges sur Windows avec MSVC. Pour une approximation étroite, chaque DLL est modélisée comme son propre programme C ++, avec un runtime entièrement indépendant. Par conséquent, il existe une copie de votre inlinevariable pour le programme principal et une autre pour la DLL.

Anthony Williams
la source
1
Empteur de mise en garde similaire : la liaison de la même bibliothèque statique dans deux DLL (que vous liez ensuite avec le même programme) produira deux copies de toutes les variables de la bibliothèque statique.
Max Langhof
Cela signifierait, je suppose, que je dois utiliser des variables non intégrées. Est-ce correct? Au moins dans le cas de plusieurs DLL où je veux partager une valeur modifiée lors de l'exécution ...
Germán Diago
1
Oui, vous devrez utiliser des non- inlinevariables. Vous devez également vous assurer qu'ils ont été exportés à partir d'une DLL et importés de là à tous les autres endroits.
Anthony Williams