Kann eine Inline-Variable nach der Initialisierung in C ++ 17 geändert werden?

11

Mein Szenario ist das folgende (es hat in clang funktioniert, aber nicht in gcc)

liba.hpp:

inline int MY_GLOBAL = 0;

libother.cpp: (dll)

#include "myliba.hpp"

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

someexe.cpp:

RunAppThatUsesBothLibAandLibOther();

Das Problem ist, dass die Inline-Variable an Stellen, an denen ich 28 erwartet hatte, 0 anzeigt, da sie zur Laufzeit bereits geändert wurde. MSVC ist damit nicht einverstanden, aber Clang macht das, was ich erwarten würde.

Die Frage ist: Können Inline-Variablen in meinem Szenario zur Laufzeit geändert werden? (Ich habe das Problem durch De-Inlining der Variablen gelöst.)

Germán Diago
quelle

Antworten:

10

Ja, inlineVariablen können nach der Initialisierung geändert werden.

DLLs sind jedoch unter Windows mit MSVC seltsame Dinge. In enger Näherung wird jede DLL als eigenes C ++ - Programm mit einer völlig unabhängigen Laufzeit modelliert. Daher gibt es eine Kopie Ihrer inlineVariablen für das Hauptprogramm und eine andere für die DLL.

Anthony Williams
quelle
1
Ähnliche Einschränkung : Wenn Sie dieselbe statische Bibliothek mit zwei DLLs verknüpfen (die Sie dann mit demselben Programm verknüpfen), werden zwei Kopien aller statischen lib-Variablen erstellt.
Max Langhof
Dies würde bedeuten, dass ich Nicht-Inline-Variablen verwenden muss. Ist das richtig? Zumindest bei mehreren DLLs, bei denen ich einen zur Laufzeit geänderten Wert teilen möchte ...
Germán Diago
1
Ja, Sie müssten Nichtvariablen verwenden inline. Sie müssten auch sicherstellen, dass sie aus einer DLL exportiert und von dort an allen anderen Orten importiert wurden.
Anthony Williams