如果某个宏被调用,那么这个想法会导致编译时错误并显示错误消息。可以这样做吗?怎么样?
#ifdef RUBBISH_COMPILER
# define alignof(T) // what here?
#endif
const std::size_t = alignof(some_type); // invocation, causing compilation error
调用应该产生一个合理的错误消息,如 alignof()不适用于此编译器。
答案 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静态断言所使用的那些),但它们最近只是历史上的兴趣。