具有外部链接的内联函数中对静态对象的引用

时间:2018-10-29 10:22:47

标签: c static language-lawyer inline linkage

6.7.4指定为约束 that

  

具有外部链接的函数的内联定义不应   包含带有静态或线程的可修改对象的定义   存储期限,并且不得包含对标识符的引用   具有内部链接。

所以这暗示着:

#if 1 /*OK*/
int const const_global=0;
inline int ret_const_global(void) { return const_global; }
int nonconst_global=0;
inline int ret_nonconst_global(void) { return nonconst_global; }
void noop(void) { static int const const_local_static = 42;  }
#else
//constraint violations
static int const const_global=0;
inline int ret_const_global(void) { return const_global; }
static int nonconst_global=0;
inline int ret_nonconst_global(void) { return nonconst_global; }
#endif

#if 1块可以,而另一个则不能。

我不太了解的是“对具有内部链接的标识符的引用”部分的含义。

是否提到了一个可以的静态静态“对具有内部链接的标识符的引用”?

inline int ret_const_local_static(void) { 
    static int const const_local_static = 42; 
    return const_local_static; //compiles but OK?
}

正在获取静态地址吗?

inline int const* ret_ref_to_const_local_static(void) { 
    static int const const_local_static = 42; 
    static int const*const ref = &const_local_static; 
    return ref;
}

我的编译器都没有为最后两个示例发布诊断信息(并且我特别想使用最后一个示例,尽管如果编译器使用内联版本,我可能会在不同的编译单元中获得不同的地址的事实),但它们符合要求吗?

“对具有内部链接的标识符的引用”应该是什么意思?

1 个答案:

答案 0 :(得分:3)

6.2.2p6说:

  

以下标识符没有链接:声明为对象或函数以外的任何标识符;声明为功能参数的标识符;声明的没有存储类说明符extern的对象的块作用域标识符。

因此,我想说的是您要使用的示例不包含对具有内部链接的标识符的引用。它们包含对没有链接的标识符的引用。