C ++ 17での初期化後にインライン変数を変更できますか?


11

私のシナリオは以下です(それはclangでは機能しましたがgccでは機能しませんでした)

liba.hpp:

inline int MY_GLOBAL = 0;

libother.cpp:(dll)

#include "myliba.hpp"

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

someexe.cpp:

RunAppThatUsesBothLibAandLibOther();

問題は、インライン変数が実行時にすでに変更されていたため、28を期待した場所でインライン変数が0を示していたことです。MSVCはこれに同意しませんが、clangは私が期待することを行います。

問題は、私のシナリオでは、実行時にインライン変数を変更できるかどうかです。(変数をインライン展開することで問題を解決しました。)

回答:


10

はい、inline変数は初期化後に変更できます。

ただし、DLLはMSVCを使用するWindowsでは奇妙なものです。厳密に言えば、各DLLは完全に独立したランタイムを備えた独自のC ++プログラムとしてモデル化されています。したがって、inlineメインプログラム用の変数とDLL用の変数のコピーが1つずつあります。


1
同様の警告エンプター:同じ静的libを2つのDLLにリンクすると(同じプログラムにリンクします)、すべての静的lib変数の2つのコピーが生成されます。
Max Langhof、

これは、おそらくインラインではない変数を使用する必要があることを意味します。これは正しいです?私は、実行時に変更された値を共有したい複数のDLLの場合は、少なくとも...
ヘルマン・Diago

1
はい、非inline変数を使用する必要があります。また、1つのDLLからエクスポートされ、そこから他のすべての場所にインポートされていることを確認する必要があります。
アンソニーウィリアムズ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.