【发布时间】:2018-01-22 18:11:54
【问题描述】:
我有一个仅头文件的库,它在调试模式下编译时启用了一些额外的快速失败运行时断言。标头的简化版本如下所示:
#include <exception>
#ifdef MYDEBUG
# define MYASSERT(condition) do{ if (!(condition)) std::terminate(); } while(0)
#else
# define MYASSERT(condition)
#endif
template<typename T>
class Checker
{
public:
T operator()(T value)
{
MYASSERT(value);
return value;
}
};
如果一个翻译单元在没有首先定义MYDEBUG 的情况下包含标头,而另一个在定义MYDEBUG 后包含标头,并且我将生成的目标文件链接在一起,这是否构成ODR 违规?
如何避免这种情况,但仍允许每个 TU 在包含标头时独立指定其所需的断言设置?
【问题讨论】:
-
为什么不使用
MYDEBUG作为转换运算符的编译时参数?T operator()(T value) { return do_conversion(value, MYDEBUG); },其中do_conversion可能包含也可能不包含断言