Visual c++ 在visualc+;中,内联静态变量在模块之间是唯一的吗+;?

Visual c++ 在visualc+;中,内联静态变量在模块之间是唯一的吗+;?,visual-c++,dll,c++17,Visual C++,Dll,C++17,c++17引入内联(静态)变量。据说 “编译器将保证一个变量只有一个定义 而且它只在所有编译单元中初始化一次。” 我想知道VisualC++是否保证内联静态变量在多个模块(DLL和EXE)上是唯一的。 如果cat.h包含在多个DLL和一个exe中,那么cat::var在应用程序中是唯一的吗?您的问题是非常“开放的”,但是,如果您真正想要的只是一个实例,那么您应该定义一个宏,比如说DLLIMPEXP,该宏在一个模块中有条件地定义为\u declspec(dllexport)(其中类是实际定义的,或

c++17引入内联(静态)变量。据说

“编译器将保证一个变量只有一个定义 而且它只在所有编译单元中初始化一次。”

我想知道VisualC++是否保证内联静态变量在多个模块(DLL和EXE)上是唯一的。
如果cat.h包含在多个DLL和一个exe中,那么cat::var在应用程序中是唯一的吗?

您的问题是非常“开放的”,但是,如果您真正想要的只是一个实例,那么您应该定义一个宏,比如说
DLLIMPEXP
,该宏在一个模块中有条件地定义为
\u declspec(dllexport)
(其中类是实际定义的,或至少是实例化的)和其他两个中的
\uuu declspec(dllimport)
。然后进行标题声明:

//cat.h
class DLLIMPEXP Cat
{
public:
    inline static int var = 0;
};
注1:我认为类链接声明覆盖了成员的链接声明。 注2:它不必是导出的DLL;EXE也可以导出,DLL也可以导入!
注3:正如其他人所说,C++17标准没有(不能)跨链接模块应用。

如果您有三个模块,一个exe和两个DLL,那么这里将有三个
var
实例。我不知道PE模块的任何链接机制允许它们引用相同的内存。@camino我希望它是唯一的,内联关键字正在替换“extern”,其中只有一个模块实际上会实例化变量,因为只有一个模块包含.CPP。但是为什么不直接测试它呢?也有第一个问题:C++不能保证DLL的任何内容,因为它们是严格的Windows操作系统。
//cat.h
class DLLIMPEXP Cat
{
public:
    inline static int var = 0;
};