具有外部链接的函数的内联定义不应 包含带有静态或线程的可修改对象的定义 存储期限,并且不得包含对标识符的引用 具有内部链接。
所以这暗示着:
#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;
}
我的编译器都没有为最后两个示例发布诊断信息(并且我特别想使用最后一个示例,尽管如果编译器使用内联版本,我可能会在不同的编译单元中获得不同的地址的事实),但它们符合要求吗?
“对具有内部链接的标识符的引用”应该是什么意思?
答案 0 :(得分:3)
6.2.2p6说:
以下标识符没有链接:声明为对象或函数以外的任何标识符;声明为功能参数的标识符;声明的没有存储类说明符
extern
的对象的块作用域标识符。
因此,我想说的是您要使用的示例不包含对具有内部链接的标识符的引用。它们包含对没有链接的标识符的引用。