C++ ODR

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++ 和面向对象设计。
--------------------------------------------------------------------------------
  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
英语:解决了在线争议解决方法(ODR-在线争议解决),主要是从中提出了新的观点。 我们捍卫的程序法也开始被分析,并且也需要被分析。 从某种意义上说,ODR的使用不仅限于国家裁决的解决方案,而且不应作为立即和主要的选择;从某种意义上说,ODR的使用与现代诉诸司法的愿景一起发展。 当争端有可能通过其他方式解决时,司法干预不能被认为是有序的或无用的。 实际上,实际上是在促进和鼓励这些方法(在合法的情况下),以防止和避免冲突和诉讼,而不仅仅是在冲突和诉讼已在进行时(即,在已经不必要地花费了公共和私人资源的情况下)解决它们。 。 实际上,至关重要的是,ODR在司法领域之外(或更确切地说,在司法领域之前)是朝着逐渐远离巴西摆脱“刑法文化”,更接近于人们所期望的“安抚文化”迈出的基本一步。所谓的在线争议解决方法(ODR),其核心目的是提出(并且必须)分析一种新的观点,使我们维持程序法。 ODR的使用与现代诉诸司法的理论一起发展,从某种意义上说,它不仅限于法院裁决,不能将其作为直接和主要的选择; 当可以通过其他方式解决冲突时,就不应认为法院干预是必要的或无用的。 因此,有必要推广和促进这种方法(在被证明是合法的情况下),以防止和避免冲突和诉讼,而不仅仅是在冲突和诉讼已在进行时(即,当公共和私人资源本来就不必要时就解决)。花费)。 更重要的是,ODR在法院之外(或更佳的是在法院之前)是至关重要的一步,它使巴西逐渐脱离了现有的“裁决文化”,并使其接近理想的“安抚文化”。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值