首页 > 解决方案 > 了解 DCL60-CPP 中的不合规代码示例:遵守单一定义规则

问题描述

我正在寻找一些安全的编码指南,并遇到了 SEI CERT C++ 编码标准。

到目前为止,大多数事情都很清楚,但我不明白DCL60-CPP 的最后一个不合规代码示例:遵守单一定义规则

在这个不兼容的代码示例中,常量对象n具有内部链接,但在f()具有外部链接的 内部使用 odr。因为f()被声明为内联函数,所以f()在所有翻译单元中的定义必须相同。但是,每个翻译单元都有一个唯一的 实例n,导致违反 ODR。

const int n = 42;

int g(const int &lhs, const int &rhs);

inline int f(int k) {
    return g(k, n);
}

我试图将显示的代码放在头文件中,并将其包含在两个单独的 cpp 文件中。然后我用clang++和g++编译它。两者都没有警告。它正常执行。

编辑: 所以我不明白所示示例如何或在什么情况下违反了 ODR。

标签: c++one-definition-rule

解决方案


确实违反了 ODR。违反 ODR 是“未定义的行为”。

一种更常见的未定义行为形式是“完全按照程序员的预期行事”。不过,根据我的经验,一种更常见的形式是“几乎一直按照程序员的预期去做,但偶尔会随机崩溃”。

这个特定的 UB 可能会一直工作 - 直到您打开改进的链接时间优化,那时它可能会在您的脑海中崩溃。


推荐阅读