根据我听说的信息,如果你有一个变量,例如:
inline int a_var;
或
struct Foo
{
static inline int a_var;
};
在头文件中,将该标头包含在静态库 Library2 中的某个位置,然后将其包含在库 Library2 中,然后每个库将拥有自己的该变量的副本。
所以我测试了这个。我制作了一个可执行文件并链接到静态库 1 和静态库2。
我在公共标头的结构中声明一个变量:
struct MyStruct
{
static inline int static_var = 0;
};
在我的可执行文件/main() 中我这样做:
void library_one_function();
void library_two_function();
#include "common_header.h"
#include <iostream>
int main()
{
MyStruct::static_var = 1;
std::cout << "Value from executable = " << MyStruct::static_var << "\n"; // I GET 1
library_one_func(); // LIBRARY ONE FUNCTION CHANGES IT TO 7
std::cout << "Value from executable = " << MyStruct::static_var << "\n"; // I GET 7
library_two_function(); // LIBRARY TWO FUNCTION CHANGES IT TO 100
std::cout << "Value from executable = " << MyStruct::static_var << "\n"; // I GET 100
}
每次我引用该变量时,都没有迹象表明每个库都有自己的副本。总是一样的。为什么人们说内联变量有自己的副本?
每个静态库都应该获得自己的内联变量副本吗?
C++ 承认单独编译和预编译库的可能性,但不允许它们的使用影响格式良好的 C++ 程序的行为或语义。 库的参与和特征是与C++语义无关的实现细节。 如果在给定的实现中,多个静态库各自拥有自己的
static
inline
数据成员副本,那么该实现的链接器将负责执行所需的任何操作,以确保 C++ 规范...
如果未声明静态数据成员
该数据成员有一份由该类的所有对象共享的副本。thread_local
(类.静态.数据;C23 11.4.9.3/1)
...很满意。 这可以通过以某种适当的方式将多个副本合并为一个,如果存在冲突则完全拒绝链接,或者也许通过其他方式。