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 ofD
, 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 ofD
, 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 ofD
; and
此用法符合“除……和…和…”部分中的所有条件:
>名称CONSTANT实际上是指具有内部链接的非易失性const对象
>它在f()的所有定义中具有相同的文字类型.
>它用常量表达式2初始化.
>它不是经常使用的.
>它在f()的所有定义中具有相同的值.
“它不是使用odr”这一点应该是指“它不是在f()中使用的 – 但是如果你碰巧在程序中的其他地方使用CONSTANT,它就不会破坏f()”.
标签:one-definition-rule,c,c11 来源: https://codeday.me/bug/20190828/1754738.html