Bisakah variabel inline diubah setelah inisialisasi dalam C ++ 17?

11

Skenario saya adalah sebagai berikut (ini bekerja dalam dentang tetapi tidak dalam gcc)

liba.hpp:

inline int MY_GLOBAL = 0;

libother.cpp: (dll)

#include "myliba.hpp"

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

someexe.cpp:

RunAppThatUsesBothLibAandLibOther();

Masalahnya adalah bahwa variabel inline menunjukkan 0 di tempat-tempat di mana saya harapkan 28 karena sudah dimodifikasi pada saat run-time. MSVC tidak setuju dengan ini, tetapi dentang melakukan hal yang saya harapkan.

Pertanyaannya adalah: bisakah variabel inline dimodifikasi pada saat run-time dalam skenario saya? (Saya memecahkan masalah dengan de-inlining variabel.)

Germán Diago
sumber

Jawaban:

10

Ya, inlinevariabel dapat dimodifikasi setelah inisialisasi.

Namun, DLL adalah hal aneh di Windows dengan MSVC. Untuk perkiraan yang dekat, setiap DLL dimodelkan sebagai program C ++ sendiri, dengan runtime yang sepenuhnya independen. Oleh karena itu, ada satu salinan inlinevariabel Anda untuk program utama, dan satu lagi untuk DLL.

Anthony Williams
sumber
1
Peringatan peringatan serupa : Menghubungkan lib statis yang sama ke dalam dua DLL (yang kemudian Anda tautkan dengan program yang sama) akan menghasilkan dua salinan dari semua variabel lib statis.
Max Langhof
Ini berarti, saya kira, bahwa saya harus menggunakan variabel non-inline. Apakah ini benar? Setidaknya dalam kasus beberapa dll di mana saya ingin berbagi nilai yang diubah saat runtime ...
Germán Diago
1
Ya, Anda harus menggunakan non- inlinevariabel. Anda juga perlu memastikan bahwa mereka diekspor dari satu DLL dan diimpor dari sana di semua tempat lain.
Anthony Williams