我不想预处理特定的宏。它不应该用它的值代替它。可能吗?

时间:2010-10-13 12:20:08

标签: c c-preprocessor

示例=

#define a 100
#define b 200
main()
{
  int c=a+b;
}

预处理后

输出 -

#define a 100
main()
{
 int c=a+200;
}

6 个答案:

答案 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