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.)

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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.