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

问题描述 投票:1回答:1

我知道(邪恶的?)C ++宏会在除字符串文字之外的所有字符串上引发编译错误(在SO中找到它但不能再找到它):

#define IS_STRING_LITERAL(X) "" X ""

是否存在可以执行“相反”的宏,即在字符串文字上引发编译器错误,而不是在其他输入上引发编译器错误?

编辑:请参阅注释,这是针对微控制器上的调试宏。字符串文字应该存在于flash中,如果我调用错误的宏,我希望在编译时得到通知。 'Others'应该是int,float,char,char []和其他'basic'类型。

c++ macros
1个回答
1
投票

取决于那些“其他投入”是什么。如果它们可以是任何东西,那么答案可能是“不可能的”。

你可以这样做:

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

该行检查x是否为const char *(或衰减为1),如果为真,则会引发错误。 (这不是你要求的:将普通的const char []传递给它是不可能的。)

std::cout << foo(123); // Works.
std::cout << foo("123"); // error: no type named 'type' in 'struct std::enable_if<false, void>'
© www.soinside.com 2019 - 2024. All rights reserved.