内联函数的局部静态/线程局部变量?
Posted
技术标签:
【中文标题】内联函数的局部静态/线程局部变量?【英文标题】:Local static/thread_local variables of inline functions? 【发布时间】:2015-08-23 22:22:58 【问题描述】:如果我在不同翻译单元中定义的内联函数中有一个静态局部变量或 thread_local 局部变量,那么在最终程序中,标准是否保证它们具有相同的地址?
// TU1:
inline int* f() static int x; return &x;
extern int* a;
void sa() a = f();
// TU2:
inline int* f() static int x; return &x;
extern int* b;
void sb() b = f();
// TU3:
int *a, *b;
void sa();
void sb();
int main() sa(); sb(); return a == b;
上面的总是返回 1 吗?
【问题讨论】:
【参考方案1】:是的,它总是同一个对象。作者:[dcl.fct.spec]/4:
具有外部链接的
inline
函数在所有翻译单元中应具有相同的地址。extern inline
函数中的static
局部变量始终引用同一个对象。在extern inline
函数体中定义的类型在每个翻译单元中都是相同的类型。
【讨论】:
谢谢,我猜thread_local
的案例也有类似的答案?
@AndrewTomazos:是的,我想是的,因为通过 [dcl.stc]/4,thread_local
说明符意味着 static
说明符,我在答案中引用的规则适用于说明符,而不是存储类。以上是关于内联函数的局部静态/线程局部变量?的主要内容,如果未能解决你的问题,请参考以下文章