如何通过c++宏调用编译时错误
How can I invoke a compile-time error via a C++ macro?
这个想法是在调用某个宏时产生一个编译时错误,并给出错误消息。这能做到吗?如何?
#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的静态断言所使用的技巧),但它们现在只对历史感兴趣。
相关文章:
- 在缺少函数重载时抛出异常,并带有 std::variant 而不是编译时错误
- 如何在常量计算表达式中获取编译时错误?
- C++根据调用的构造函数强制编译时错误
- 使用 std::iterator_traits<> 时编译时错误不明确
- is_same和variadic模板编译时错误无效转换
- 私有运营商删除会触发 GCC 和 Clang 的编译时错误,但不会在 MSVC 上触发编译时错误
- 运行时与编译时多态性:更好的可读性与编译时错误检查,更重要的是
- 引发编译时错误
- 为什么调用不明确的 ctor 时没有编译时错误?
- 在 sizeof 运算符上强制编译时错误
- 未经授权的私有类成员访问会产生编译时错误而不是运行时错误?
- 在呼叫运算符函数const中调用运算符时错误
- 从Mac上的终端编译时C 错误
- 使用MINGW-W64使用-M32选项(32位代码)编译时错误
- C++线程错误 - 带有类参数的编译时错误
- 尝试调用指向成员函数的函数指针时出现编译时错误
- C++:使用类型名作为基的模板类调用函数编译时错误
- 如果条件不满足,调用函数时会出现编译时错误
- 调用专用模板函数时强制编译时错误
- 如何通过c++宏调用编译时错误