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