如何通过C ++宏调用编译时错误?

时间:2014-03-14 15:54:27

标签: c++ macros compiler-errors

如果某个宏被调用,那么这个想法会导致编译时错误并显示错误消息。可以这样做吗?怎么样?

#ifdef RUBBISH_COMPILER
#  define alignof(T)  // what here?
#endif

const std::size_t = alignof(some_type);  // invocation, causing compilation error

调用应该产生一个合理的错误消息,如 alignof()不适用于此编译器

1 个答案:

答案 0 :(得分:4)

在C ++ 11中,

#define DONT_INVOKE_ME static_assert(false, "Don't invoke this macro");

从历史上看,很容易导致错误,但是将消息输入输出会更加棘手。一个简单的技巧是创建一个无效的声明,消息在声明的名称中:

#define DONT_INVOKE_ME char dont_invoke_this_macro[-1];

这并不完美,因为您不能对邮件使用自由格式文本 - 它必须是有效的标识符。有更高级的技巧(比如Boost静态断言所使用的那些),但它们最近只是历史上的兴趣。