☰
  • 首页
  • 规则分类
  • 项目介绍
search
•••

遵循 One Definition Rule

6.12.3 ID_violateODR
目录 › next › previous

任何翻译单元不得包含同一对象、函数、类型或模板的不同定义,这一准则称为“One Definition Rule(ODR)”,违反该准则会导致标准未定义的行为。

示例:

// In a.cpp
struct T {    // One definition
    short i;
};

T* foo() { .... }

// In b.cpp
struct T {    // Non-compliant, a different definition
    long i;
};

void bar(T*) { .... }

// In c.cpp
struct T;
T* foo();
void bar(T*);

void baz() {
    bar(foo());   // Problems
}

例中类 T 在两个翻译单元中有不同的定义,违反了 One Definition Rule,会导致未定义的行为,应在头文件中统一定义。

依据

ISO/IEC 14882:2003 3.2(5)-undefined ISO/IEC 14882:2011 3.2(5)-undefined

参考

MISRA C++ 2008 3-2-2 SEI CERT DCL60-CPP
Copyright©2024 360 Security Technology Inc., Licensed under the Apache-2.0 license.