我想知道如果两个声明都写在一个头文件中,那么这两个声明之间的区别到底是什么:
inline thread_local MyClass obj1; // inline with thread_local
thread_local MyClass obj2; // no inline
如 C++17 中所述,向变量添加内联会强制所有翻译单元看到该变量的相同地址。这是否意味着obj2
可以在不同的翻译单元中获取不同的地址值?我们应该使用obj1
而不是obj2
的情况是什么?
如果将此头文件包含在多个编译单元中,您将获得obj2
的多个定义。但是obj1
工作正常,因为链接器将保证只有一个定义存在,并且所有编译单元将使用相同的定义(因此使用相同的地址(。
因此,您的代码应使用 extern
进行obj2
,并在单个编译单元中定义它。但是inline
已经为你做了obj1
.
这是否意味着
obj2
可以获得不同的地址值在不同的翻译单元中?
在这种特殊情况下,不,因为它不会编译。但是如果你static
添加到obj2
,你将得到一个每个编译单元的地址。
我们应该强调什么情况,我们应该使用
obj1
而不是比obj2
?
你永远不应该使用这样的obj2
,obj1
是正确的方法。如果你想避免inline
,你可以使用extern
进行obj2
。