Satır içi bir değişken C ++ 17'de başlatıldıktan sonra değiştirilebilir mi?


11

Benim senaryom aşağıdaki (clang çalıştı ama gcc değil)

liba.hpp:

inline int MY_GLOBAL = 0;

libother.cpp: (dll)

#include "myliba.hpp"

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

someexe.cpp:

RunAppThatUsesBothLibAandLibOther();

Sorun, satır içi değişkenin çalışma zamanında değiştirildiği için 28'i beklediğim yerlerde 0 göstermesidir. MSVC buna katılmıyor, ancak clang beklediğim şeyi yapıyor.

Soru şudur: Satır içi değişkenler senaryomda çalışma zamanında değiştirilebilir mi? (Değişkeni devre dışı bırakarak sorunu çözdüm.)

Yanıtlar:


10

Evet, inlinedeğişkenler başlatma sonrasında değiştirilebilir.

Ancak, DLL dosyaları MSVC ile Windows garip şeylerdir. Yakından yaklaşmak için, her DLL tamamen bağımsız bir çalışma zamanı ile kendi C ++ programı olarak modellenmiştir. Bu nedenle, inlineana program için değişkeninizin bir kopyası ve DLL için başka bir kopyası vardır .


1
Benzer uyarı imptoru : Aynı statik lib'i iki DLL'ye bağlamak (daha sonra aynı programla bağlarsınız) tüm statik lib değişkenlerinin iki kopyasını üretir.
— Max Langhof

Bu, sanırım, satır içi olmayan değişkenler kullanmam gerektiği anlamına gelir. Bu doğru mu? En azından çalışma zamanında değişti bir değer paylaşmak istiyorum birden fazla dll durumunda ...
— Germán Diago

1
Evet, inlinedeğişken olmayanları kullanmanız gerekir . Ayrıca bir DLL'den dışa aktarıldığından ve diğer tüm yerlerden oradan içe aktarıldığından emin olmanız gerekir.
— Anthony Williams
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.