¿Se puede cambiar una variable en línea después de la inicialización en C ++ 17?

11

Mi escenario es el siguiente (funcionó en clang pero no en gcc)

liba.hpp:

inline int MY_GLOBAL = 0;

libother.cpp: (dll)

#include "myliba.hpp"

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

someexe.cpp:

RunAppThatUsesBothLibAandLibOther();

El problema es que la variable en línea mostraba 0 en lugares donde esperaba 28 porque ya estaba modificada en tiempo de ejecución. MSVC no está de acuerdo con esto, pero el sonido metálico hace lo que yo esperaría.

La pregunta es: ¿ se pueden modificar las variables en línea en tiempo de ejecución en mi escenario? (Resolví el problema deslindando la variable).

Germán Diago
fuente

Respuestas:

10

Sí, las inlinevariables se pueden modificar después de la inicialización.

Sin embargo, las DLL son cosas extrañas en Windows con MSVC. Para una aproximación cercana, cada DLL se modela como su propio programa C ++, con un tiempo de ejecución completamente independiente. Por lo tanto, hay una copia de su inlinevariable para el programa principal y otra para la DLL.

Anthony Williams
fuente
1
Advertencia similar : vincular la misma biblioteca estática en dos DLL (que luego se vincula con el mismo programa) producirá dos copias de todas las variables de biblioteca estática.
Max Langhof
Esto significaría, supongo, que debo usar variables no en línea. ¿Es esto correcto? Al menos en el caso de múltiples dlls donde quiero compartir un valor cambiado en tiempo de ejecución ...
Germán Diago
1
Sí, necesitaría usar no inlinevariables. También deberá asegurarse de que se exportaron desde una DLL e importaron desde allí en todos los demás lugares.
Anthony Williams