定义的同等性
这就引出一个问题:什么时候两个定义完全相同?单定义规则 (ODR,One Definition Rule)定义了两个或多个定义必须满足完全相同的需求。在不同的翻译单元中,当且仅当两个定义中每个符号都相同,并且这些符号在两个翻译单元具有相同的 意思时,这两个定义才完全相同。例如:
//file first.cpp
inline intD::getVal () { return 10; }
//file second.cpp
typedefint I;
inline I D::getVal () { return 10; }
在这个例子中,getVal() 的定义看上去似乎相同。然而,它们打破了 ODR,因为‘I’和‘int’不是相同的符号,虽然它们的意思一样。
在下面这个例子中,两个定义是逐个符号都相同的,但是它们依然打破了 ODR,因为每个定义中的符号不具有同样的意思:
//file first.cpp
#define I long
inline I D::getVal () { return 10; }
//file second.cpp
typedefint I;
inline I D::getVal () { return 10; }
空格和注释不影响 ODR。在下面的例子中,两个定义在写法上不同的,但是它们依然满足 ODR:
//file first.cpp
inline intC::getVal () { return 10; }
//file second.cpp
inline intC::getVal () { /*complies with the ODR*/
return 10; }
简单把 呵呵 自己动手做做看吧