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.