Можно ли изменить встроенную переменную после инициализации в C ++ 17?

11

Мой сценарий следующий (он работал в Clang, но не в GCC)

liba.hpp:

inline int MY_GLOBAL = 0;

libother.cpp: (dll)

#include "myliba.hpp"

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

someexe.cpp:

RunAppThatUsesBothLibAandLibOther();

Проблема в том, что встроенная переменная показывала 0 в тех местах, где я ожидал 28, потому что она была изменена во время выполнения. MSVC не согласен с этим, но Clang делает то, что я ожидал.

Вопрос в том, могут ли встроенные переменные быть изменены во время выполнения в моем сценарии? (Я решил проблему, отключив переменную.)

Герман Диаго
источник

Ответы:

10

Да, inlineпеременные могут быть изменены после инициализации.

Тем не менее, библиотеки DLL странные вещи в Windows с MSVC. В близком приближении каждая DLL моделируется как собственная программа на C ++ с полностью независимой средой выполнения. Следовательно, есть одна копия вашей inlineпеременной для основной программы, а другая для DLL.

Энтони Уильямс
источник
1
Подобный предостерегающий emptor : Связывание одной и той же статической библиотеки в две библиотеки DLL (которые вы затем связываете с одной и той же программой) создаст две копии всех статических переменных библиотеки.
Макс
Думаю, это будет означать, что я должен использовать не встроенные переменные. Это правильно? По крайней мере, в случае нескольких dll, где я хочу поделиться значением, измененным во время выполнения ...
Герман Диаго
1
Да, вам нужно будет использовать не inlineпеременные. Вам также необходимо убедиться, что они были экспортированы из одной DLL и импортированы оттуда во все остальные места.
Энтони Уильямс