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.