c - 如何在宏中使用#ifdef ?'#' 后面没有跟宏参数

标签 c macros

我拿了一个用c写的项目,里面有很多宏。

我想使用一个新的宏来检查宏是否被激活。

但是符号#在宏中是保留的。如何修复我的代码?谢谢:)

#define CHECK_MACRO( macro )\
#ifdef macro
printf("defined "#macro"\n");\
#else
printf("not defined "#macro"\n");\
#endif

最佳答案

您不能在宏中使用预处理器条件指令。一般来说,解决方案是将其彻底颠覆:使用条件指令在不同情况下以不同方式定义宏。但是,这不适用于您建议的通用宏测试宏,而且它还受到以下事实的限制:它确定条件是否在定义宏的位置成立,而不是在使用宏的位置成立。

你可能会感到安慰,因为这无论如何都不会起作用,因为类函数宏的参数在被替换到宏的替换文本之前被扩展了(除了几个不适用于代码关键部分的特殊情况)。

如果所有感兴趣的宏的可能值仅限于可能作为标识符出现或出现在标识符中的简短标记列表,则有一些替代方法可以工作。如果您可以选择一小部分您有兴趣测试的宏,则有不同的替代方案可能就足够了。没有任何替代方案可以完全通用地执行您建议的操作,除非您计算直接编写条件编译指令,而不使用宏,这实际上是实现它的常用方法。

关于c - 如何在宏中使用#ifdef ?'#' 后面没有跟宏参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58759122/

相关文章:

C 覆盖函数的返回地址导致内核 panic

c - 无法将int数组发送到C中的函数中

c - 在循环中使用 2 个变量对数组求和(并运行循环 N/2 次)比仅使用一个变量的运行时间更快。为什么?

c - 在不相关的进程之间设置IPC

macros - 宏中 `use` 的正确方法

c - 如何将 OpenMP 指令 (#pragmas) 包装为函数或类似函数的宏?

c - 无论如何要知道变量是否已在 C 中初始化?

macros - 从 Quicklisp 包内的宏调用函数

matlab - 以编程方式保存MatLab中的所有脏文件

c++ - GCC/CLANG 预处理器与 MSVC 之间的差异是什么?