每个静态库都应该获得自己的内联变量副本吗?

问题描述 投票:0回答:1

根据我听说的信息,如果你有一个变量,例如:

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++ inline
1个回答
0
投票

每个静态库都应该获得自己的内联变量副本吗?

C++ 承认单独编译和预编译库的可能性,但不允许它们的使用影响格式良好的 C++ 程序的行为或语义。 库的参与和特征是与C++语义无关的实现细节。 如果在给定的实现中,多个静态库各自拥有自己的

static
inline
数据成员副本,那么该实现的链接器将负责执行所需的任何操作,以确保 C++ 规范...

如果未声明静态数据成员

thread_local
该数据成员有一份由该类的所有对象共享的副本。

(类.静态.数据;C23 11.4.9.3/1)

...很满意。 这可以通过以某种适当的方式将多个副本合并为一个,如果存在冲突则完全拒绝链接,或者也许通过其他方式。

© www.soinside.com 2019 - 2024. All rights reserved.