遵循 One Definition Rule
6.12.3 ID_violateODR
任何翻译单元不得包含同一对象、函数、类型或模板的不同定义,这一准则称为“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