满足单定义规则

ZDNet软件频道 时间:2004-11-01 作者:Builder.com |  我要评论()
本文关键词:cpptips DannyKalev
C++ 标准规定“每个程序应该只包含那个程序中用到的每个非内联函数或对象的一个定义”。
本文译自Builder.com,未经许可请勿转载

C++ 标准规定“每个程序应该只包含那个程序中用到的每个非内联函数或对象的一个定义”。然而在同一个程序中,一个类、枚举类型、具有内部链接的内联函数和和一个模板可能有不止一个定义——只要每个定义出现在一个独立的翻译单元即可。对于内联函数和模板的情况,常用做法是在头文件中编写它们的定义,然后在每个独立编译的源文件中使用 #include 引入它。

定义的同等性

这就引出一个问题:什么时候两个定义完全相同?单定义规则(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; }


本文作者:Danny Kalev是一个具有14年经验的系统分析家、软件工程师,尤其擅长C++ 和面向对象设计。


责任编辑:李宁

欢迎评论投稿

百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134