其他分享
首页 > 其他分享> > c – 在头文件中使用常量符合ODR

c – 在头文件中使用常量符合ODR

作者:互联网

查看another question我意识到我不能通过头文件使用匿名命名空间中的对象或函数,因为它会在类定义或内联函数中导致ODR违规.如果是这种情况,那么是否可以安全地在内联函数或类中使用命名const或constexpr静态对象?例如,如果CONSTANT位于命名空间下面,那将是不安全的,但是可以使用带有静态链接的常量吗?

// some header file to be included by multiple .cpp files
static const/*expr*/ int CONSTANT = 2;

inline int f() {
  return CONSTANT;
}

class Cls {
  int mem = CONSTANT;
};

解决方法:

这段代码没问题.完整段落(C 14 [basic.def.odr / 6.2])是:

in each definition of D, corresponding names, looked up according to 3.4, shall refer to an entity defined within the definition of D, or shall refer to the same entity, after overload resolution and after matching of partial template specialization, except that a name can refer to a non-volatile
const object with internal or no linkage if the object has the same literal type in all definitions of D, and the object is initialized with a constant expression, and the object is not odr-used, and the object has the same value in all definitions of D; and

此用法符合“除……和…和…”部分中的所有条件:

>名称CONSTANT实际上是指具有内部链接的非易失性const对象
>它在f()的所有定义中具有相同的文字类型.
>它用常量表达式2初始化.
>它不是经常使用的.
>它在f()的所有定义中具有相同的值.

“它不是使用odr”这一点应该是指“它不是在f()中使用的 – 但是如果你碰巧在程序中的其他地方使用CONSTANT,它就不会破坏f()”.

标签:one-definition-rule,c,c11
来源: https://codeday.me/bug/20190828/1754738.html