在[dcl.attr.contract.check] p3中,当前的C++草稿包含:
不应使用编程方式来设置、修改或查询翻译单元的构建级别。
我不明白为什么建议不允许查询合同级别。使用当前的assert
宏,可以检测是否通过NDEBUG
宏来使用assert。
在某些情况下,查询合同级别非常有用,例如:
在原子比较交换中添加附加变量以跟踪附加state.
建议不能查询构建级别背后的理由是什么?
发布于 2019-05-22 03:42:32
建议实现不要提供这样的查询,因为它会破坏检查级别的混合用法。
就目前而言,在一个检查级别下构建一个库,并将其链接到另一个检查级别下构建的代码,在形式上没有任何错误。然而,如果代码可以很容易地查询哪个检查级别是可用的,这可能会破坏这个用例。这样的查询可用于影响类型的ABI等。如果库有这样的接口,那么您必须在相同的检查级别下构建消费代码,以便任何头文件等都将定义相同的ABI。
有没有可能以一种不影响ABI和接口的方式使用这样的查询?好的。但是提供一个测试使得它很容易搞砸。
按照目前的情况,你可以让一个库有它自己的测试,当在特定的检查级别或类似的级别下编译时,期望定义一个#define
。但是现在这样的定义是你的库的构建接口的一部分。这只是您的构建文档的一部分;如果人们在check-level X下构建您的库,他们必须提供一个#define
。并且任何使用在这种情况下构建的库的代码也必须提供该定义。
这就是最好的部分:使用代码不必共享您的检查级别。他们必须共享你的定义,而不是实际的检查级别。您的定义属于库;检查级别属于用户。
https://stackoverflow.com/questions/56244405
复制相似问题