用于引发字符串文本C++的编译器错误的宏

Macro to raise compiler error for string literal C++

本文关键字:编译器 错误 C++ 文本 字符串 用于      更新时间:2023-10-16

我知道(邪恶?C++宏,它对除字符串文字之外的所有内容都引发编译器错误(前段时间在 SO 中找到它,但无法再次找到它(:

#define IS_STRING_LITERAL(X) "" X ""

是否有一个宏可以做"相反"的事情,即在字符串文字上引发编译器错误,但在其他输入上则不然?

编辑:请参阅评论,这是用于微控制器上的调试宏。字符串文字应该存在于 flash 中,如果我调用错误的宏,我希望在编译器时收到通知。"其他"应该是 int、float、char、char [] 和其他"基本"类型。

取决于这些"其他输入"是什么。如果它们可以是任何东西,那么答案可能是"不可能"。

你可以做这样的事情:

#define foo(x) (std::enable_if_t<!std::is_same_v<const char *, decltype(+(x))>>(), (x))

此行检查x是否const char *(或衰减为 1(,如果为 true,则会引发错误。(这不是你所要求的:不可能传递一个普通的const char []

std::cout << foo(123); // Works.
std::cout << foo("123"); // error: no type named 'type' in 'struct std::enable_if<false, void>'