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

How can I invoke a compile-time error via a C++ macro?

本文关键字:调用 编译时错误 c++ 何通过      更新时间:2023-10-16

这个想法是在调用某个宏时产生一个编译时错误,并给出错误消息。这能做到吗?如何?

#ifdef RUBBISH_COMPILER
#  define alignof(T)  // what here?
#endif
const std::size_t = alignof(some_type);  // invocation, causing compilation error

调用将产生一个合理的错误消息,如alignof()在此编译器中不可用

在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的静态断言所使用的技巧),但它们现在只对历史感兴趣。