是否可以在运行时取消定义宏? 这是我尝试过的:
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
运行应用程序时,它应该取消定义宏。但事实并非如此!我仍然在控制台上收到消息!
有人愿意帮助吗?
答案 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)
是否可以在运行时取消定义宏?
答案很简单:“没办法”
人们怎么期望这种情况发生?
即使在编译之前也要处理实际的预处理程序指令。