Чи може бути змінена вбудована змінна після ініціалізації в C ++ 17?


11

Мій сценарій такий (він працював у кланге, але не в gcc)

liba.hpp:

inline int MY_GLOBAL = 0;

libother.cpp: (dll)

#include "myliba.hpp"

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

someexe.cpp:

RunAppThatUsesBothLibAandLibOther();

Проблема полягає в тому, що вбудована змінна показувала 0 в тих місцях, де я очікувала 28, оскільки вона була змінена на час зміни часу. MSVC не погоджується з цим, але Кланг робить те, що я очікував.

Питання в тому, чи можна змінити вбудовані змінні під час виконання в моєму сценарії? (Я вирішив проблему, видаливши змінну.)

Відповіді:


10

Так, inlineзмінні можуть бути змінені після ініціалізації.

Однак DLL - це дивні речі для Windows з MSVC. Наблизившись, кожен DLL моделюється як власна програма C ++ з цілком незалежним режимом виконання. Тому є одна копія вашої inlineзмінної для основної програми, а інша для DLL.


1
Схожий емптор застереження : Якщо з'єднати одну і ту ж статичну лібу на дві DLL-файли (які ви потім пов'язуєте з тією ж програмою), вийде дві копії всіх змінних статичних ліб.
Макс Лангхоф

Це означатиме, що я думаю, що я повинен використовувати не вбудовані змінні. Це правильно? Принаймні у випадку кількох dll, де я хочу поділитися значенням, зміненим під час виконання ...
Germán Diago

1
Так, вам потрібно буде використовувати не inlineзмінні. Вам також потрібно переконатися, що вони експортувались з однієї DLL та імпортували звідти в усі інші місця.
Ентоні Вільямс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.