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

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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.