c - 是否可以将预处理器条件放入 C 宏中?

标签 c macros

有没有办法编写一个 C 预处理器宏,根据它接收到的参数扩展到不同的东西?

#define foo() ???

/* 1 */
foo(name)

/* 2 */
foo(_)

期望的结果:

/* 1 */
int name;

/* 2 */
/*ignore*/

是的,我知道宏是邪恶的。我问这个主要是出于好奇。

最佳答案

要扩展 Gavin Smith 的答案,您实际上可以在宏扩展中检查条件:

#define FOO_name 1
#define FOO__ 0

#define CONC(a,b) a##_##b

#define IF(c, t, e) CONC(IF, c)(t, e)
#define IF_0(t, e) e
#define IF_1(t, e) t

#define FOO(x) IF(CONC(FOO,x), int x;, )

FOO(name) // -> int name;
FOO(_)    // -> /*nothing*/

如果您喜欢冒险,您可以使用辅助宏轻松地扩展 IF 以允许逗号、抑制宏扩展等。

如上所述,尽管这确实要求您事先知道所有需要的名称。

关于c - 是否可以将预处理器条件放入 C 宏中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19011019/

相关文章:

c - 使用 OpenSSL 的客户端/服务器程序的文档

无法打开输出文件 name.exe 权限在 Eclipse C/C++ 中被拒绝

c - ftell 位于超过 2GB 的位置

c - 错误 : pasting "." and "red" does not give a valid preprocessing token

c - 宏扩展和字符串化 : How to get the macro name (not its value) stringified using another macro?

c - Windows 的 SIGCHLD 替换

使用不同大小的字符串文字初始化给定大小的静态字符数组会导致未定义的行为吗?

javascript - javascript可以模拟按钮点击吗?

ios - 如何在不使用对象或类方法的情况下调用另一个类的变量?

c - 具有相同名称的类似函数的宏和枚举器