在C中执行时取消定义宏

时间:2019-05-17 11:49:04

标签: c macros runtime

是否可以在运行时取消定义宏? 这是我尝试过的:

for(int i=2; i<argc; i++){
    if(strcasecmp(argv[i], "+debug")==0){
        puts("+debug");
#ifndef DEBUG
#define DEBUG
#endif
    }
    if(strcasecmp(argv[i], "-debug")==0){
        puts("-debug");
#ifdef DEBUG
#undef DEBUG
#endif
    }

我用定义的宏DEBUG编译了代码。它的作用是,它将在标准输出上显示所有消息。如果未定义,它将不会显示这些消息。因此,当我使用选项-debug运行应用程序时,它应该取消定义宏。但事实并非如此!我仍然在控制台上收到消息!

有人愿意帮助吗?

4 个答案:

答案 0 :(得分:5)

不,你不能。宏在 preprocessor 阶段被替换,因此切勿将其放入最终程序中。

答案 1 :(得分:5)

所有预处理器指令(#...)都在预处理器步骤中的编译之前执行,该步骤将原始源代码转换为可用于编译的源代码。结果(转换后的)源代码不再包含任何预处理程序指令。因此,除非修改原始源代码并重新编译程序,否则无法与预处理器指令进行交互。

答案 2 :(得分:1)

正如其他人已经解释的那样,预处理器宏是在编译时处理的,您不能在运行时更改它。

如果要在运行时切换调试内容,则需要运行时配置,例如一个变量。您可以使用预处理器宏来设置默认值。

为运行时开关使用全局变量的示例,该变量具有基于预处理器宏的默认值:

#ifdef DEBUG
int debug = 1; /* default is ON */
#else
int debug = 0; /* default is OFF */
#endif

    for(int i=2; i<argc; i++){
        if(strcasecmp(argv[i], "+debug")==0){
            puts("+debug");
            debug = 1; /* change value at run time */
        }
        if(strcasecmp(argv[i], "-debug")==0){
            puts("-debug");
            debug = 0; /* change value at run time */
        }

/* ... */


/* instead of 

#ifdef DEBUG
   do_debug_stuff();
#endif

you would have to use */
   if(debug) {
      do_debug_stuff();
   }

答案 3 :(得分:0)

  

是否可以在运行时取消定义宏?

答案很简单:“没办法”

人们怎么期望这种情况发生?

即使在编译之前也要处理实际的预处理程序指令。