Czy zmienną wbudowaną można zmienić po inicjalizacji w C ++ 17?

11

Mój scenariusz jest następujący (działał w clang, ale nie w gcc)

liba.hpp:

inline int MY_GLOBAL = 0;

libother.cpp: (dll)

#include "myliba.hpp"

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

someexe.cpp:

RunAppThatUsesBothLibAandLibOther();

Problem polega na tym, że zmienna wbudowana pokazywała 0 w miejscach, w których spodziewałem się 28, ponieważ była ona zawsze modyfikowana w czasie wykonywania. MSVC nie zgadza się z tym, ale brzęk robi to, czego bym się spodziewał.

Pytanie brzmi: czy w moim scenariuszu można modyfikować zmienne wbudowane w czasie wykonywania? (Rozwiązałem problem, usuwając z niego zmienną).

Germán Diago
źródło

Odpowiedzi:

10

Tak, inlinezmienne można modyfikować po inicjalizacji.

Jednak biblioteki DLL są dziwne w systemie Windows z MSVC. W ścisłym przybliżeniu każda biblioteka DLL jest modelowana jako własny program C ++ z całkowicie niezależnym środowiskiem uruchomieniowym. Dlatego istnieje jedna kopia inlinezmiennej dla programu głównego, a druga dla biblioteki DLL.

Anthony Williams
źródło
1
Podobne zastrzeżenie : Łączenie tej samej biblioteki statycznej w dwie biblioteki DLL (które następnie łączysz z tym samym programem) spowoduje utworzenie dwóch kopii wszystkich zmiennych biblioteki statycznej.
Max Langhof,
Oznaczałoby to, jak sądzę, że muszę używać zmiennych nieliniowych. Czy to jest poprawne? Przynajmniej w przypadku wielu bibliotek dll, w których chcę dzielić wartość zmienioną w czasie wykonywania ...
Germán Diago
1
Tak, musisz użyć nie- inlinezmiennych. Musisz także upewnić się, że zostały wyeksportowane z jednej biblioteki DLL i stamtąd zaimportowane ze wszystkich innych miejsc.
Anthony Williams,