【发布时间】:2015-06-21 07:46:21
【问题描述】:
我有一个#define 将标识符(函数名)映射到这样的新名称:
#define A doStuff
这部分我无能为力,我必须访问“A”,因为实际标识符(此处为 doStuff)可能会更改(这不在我的控制之下)。现在引用的符号(doStuff)可能存在也可能不存在,我想在前一种情况下调用该函数。对于一个简单的函数名称,我可以轻松地测试它:
#ifdef doStuff
doStuff();
#endif
但是,受限于宏名称,天真地做同样的事情是:
#ifdef A
A();
#endif
由于名称“A”已定义,而“doStuff”未定义,因此会出错。我想检查宏解析为的名称是否存在,本质上是:
#if defined(the-content-of-A)
但我不能让它工作。
所以我的问题是:有什么方法可以检查是否定义了由宏表示的标识符?如果是,该怎么做?如果没有,是否有解决方法的通用模式?
虽然我不认为这是特定于 C 或 C++ 的,但我想指出,我需要一些适用于 C++ 中定义的标识符“extern C”的东西。解决方案必须独立于平台。
很抱歉,如果之前有人问过这个问题,我找不到它,无论是在谷歌还是在 SO 上。
【问题讨论】:
-
请注意,您使用
#ifdef doStuff的示例是错误的。您无法在预处理器级别检测 C/C++ 函数的存在。此外,你想识别#define A(即A存在但没有价值)还是#define A unavailable-function? -
如果目标函数不存在,则根本不应该定义
A。然后你就可以用#ifdef检测这个case了。 -
正如许多人回答的那样,由于预处理器中存在函数,您无法更改行为。但是您可以使用模板元编程来做到这一点,请参阅此处stackoverflow.com/questions/257288/…
-
感谢您的澄清。我在问题中称为 doStuff 的符号很可能实际上是真实代码中的宏。
-
所有答案都是当场的,但我只能接受一个。也感谢其他人。