È possibile modificare una variabile inline dopo l'inizializzazione in C ++ 17?


11

Il mio scenario è il seguente (ha funzionato in clang ma non in gcc)

liba.hpp:

inline int MY_GLOBAL = 0;

libother.cpp: (dll)

#include "myliba.hpp"

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

someexe.cpp:

RunAppThatUsesBothLibAandLibOther();

Il problema è che la variabile inline mostrava 0 nei punti in cui mi aspettavo 28 perché era alrady modificata in fase di esecuzione. MSVC non è d'accordo con questo, ma Clang fa ciò che mi aspetterei.

La domanda è: le variabili incorporate possono essere modificate in fase di esecuzione nel mio scenario? (Ho risolto il problema desininando la variabile.)

Risposte:


10

Sì, le inlinevariabili possono essere modificate dopo l'inizializzazione.

Tuttavia, le DLL sono cose strane su Windows con MSVC. Ad una approssimazione ravvicinata, ogni DLL è modellata come il proprio programma C ++, con un runtime completamente indipendente. Pertanto, esiste una copia della inlinevariabile per il programma principale e un'altra per la DLL.


1
Emettitore di avvertenza simile : il collegamento della stessa lib statica in due DLL (che quindi si collega allo stesso programma) produrrà due copie di tutte le variabili lib statiche.
Max Langhof,

Ciò significherebbe, suppongo, che devo usare variabili non in linea. È corretto? Almeno nel caso di più DLL in cui desidero condividere un valore modificato in fase di esecuzione ...
Germán Diago,

1
Sì, è necessario utilizzare non inlinevariabili. Dovresti anche assicurarti che siano stati esportati da una DLL e importati da lì in tutti gli altri posti.
Anthony Williams,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.