示例=
#define a 100
#define b 200
main()
{
int c=a+b;
}
预处理后
输出 -
#define a 100
main()
{
int c=a+200;
}
答案 0 :(得分:1)
您可以尝试重构宏以允许外部配置,即
/* config.h */
/* set defaults for a and b */
#ifndef a
#define a 100
#endif
#ifndef b
#define b 200
#endif
和
/* main.c */
#include "config.h"
int main(void)
{
int c = a + b;
}
然后,您可以在构建时在外部设置宏,例如:
$ gcc -E -Da=a main.c
# 1 "main.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "main.c"
# 1 "config.h" 1
# 4 "main.c" 2
int main(void)
{
int c = a + 200;
}
$ gcc -E -Db=b main.c
# 1 "main.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "main.c"
# 1 "config.h" 1
# 4 "main.c" 2
int main(void)
{
int c = 100 + b;
}
现在,您当然没有 使用单独的配置标头,但我从维护角度推荐它,它可以更容易地跟踪可用的配置设置和他们的默认值。
答案 1 :(得分:0)
#define a 100
#define b 200
main()
{
#undef b
int c=a+b;
}
答案 2 :(得分:0)
没有。你的真正目标是什么? 如果你想这样做,最好制作一些脚本来做到这一点。
答案 3 :(得分:0)
如果您不想预处理宏,请不要使用它:
#define a 100
//#define b 200
int main()
{
int c = a + 200;
return 0;
}
答案 4 :(得分:0)
预处理的目的是处理预处理指令。我不知道有什么方法可以保留特定的预处理指令,特别是因为下一步编译对这些没有任何了解。
这是使用宏时要小心的另一个原因 - 当在源中找到名称时,无论如何都会替换它:
#define a 100
main()
{
int a; // Compilation error happens here
....
}
答案 5 :(得分:0)
关于Peter Miehle的回答,unifdef可用于部分处理#if和#ifdef指令,但它不能用于有选择地扩展宏。见http://dotat.at/prog/unifdef