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

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.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.