在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做了我期望的事情。

问题是:在我的方案中,可以在运行时修改内联变量吗?(我通过取消内联变量解决了问题。)

Answers:


10

是的,inline变量可以在初始化后进行修改。

但是,DLL在带有MSVC的Windows上是很奇怪的事情。几乎可以将每个DLL建模为具有完全独立的运行时的C ++程序。因此,inline主程序有一个变量副本,而DLL 有一个副本。


1
相似的警告免责声明:将相同的静态lib链接到两个DLL(然后与同一程序链接)将产生所有静态lib变量的两个副本。
Max Langhof

我猜这意味着我必须使用非内联变量。它是否正确?至少在多个DLL,我想与大家分享价值的情况下,改变在运行时...
赫尔曼DIAGO

1
是的,您将需要使用非inline变量。您还需要确保它们是从一个DLL导出并在所有其他地方从那里导入的。
安东尼·威廉姆斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.