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

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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.