Uma variável embutida pode ser alterada após a inicialização no C ++ 17?

11

Meu cenário é o seguinte (funcionou no clang, mas não no gcc)

liba.hpp:

inline int MY_GLOBAL = 0;

libother.cpp: (dll)

#include "myliba.hpp"

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

someexe.cpp:

RunAppThatUsesBothLibAandLibOther();

O problema é que a variável inline estava mostrando 0 em locais onde eu esperava 28, porque ela já foi modificada em tempo de execução. A MSVC discorda disso, mas clang faz o que eu esperaria.

A questão é: as variáveis ​​embutidas podem ser modificadas em tempo de execução no meu cenário? (Eu resolvi o problema desinlinando a variável.)

Germán Diago
fonte

Respostas:

10

Sim, as inlinevariáveis ​​podem ser modificadas após a inicialização.

No entanto, DLLs são coisas estranhas no Windows com MSVC. Para uma aproximação, cada DLL é modelada como seu próprio programa C ++, com um tempo de execução totalmente independente. Portanto, há uma cópia da sua inlinevariável para o programa principal e outra para a DLL.

Anthony Williams
fonte
11
Emptor de advertência semelhante : vincular a mesma lib estática em duas DLLs (que você vincula ao mesmo programa) produzirá duas cópias de todas as variáveis ​​da lib estática.
Max Langhof
Suponho que isso signifique que devo usar variáveis ​​não embutidas. Isso está correto? Pelo menos no caso de várias DLLs onde eu quero compartilhar um valor alterado em tempo de execução ...
Germán Diago
11
Sim, você precisaria usar não inlinevariáveis. Você também precisa garantir que eles foram exportados de uma DLL e importados de lá em todos os outros lugares.
Anthony Williams