2

我有以下代码的#define,#ifdef来和#undef #ENDIF

#define PROC_ADD 

void main(void) 
{ 
    while(1) 
    { 
#ifdef PROC_ADD 
// Do this code here then undefined it to run the code in the else 
// processing work 
#undef PROC_ADD 
#else 
// now that PROC_ADD has been undefined run this code 
// processing work 
#endif 
    } 
} 

然而,它将运行的代码。但在PROC_ADD未定义后,它将不会运行else中的代码。

我认为原因可能是您只能在编译时定义和取消定义,而不是在运行时定义。但是,我不太确定。

+0

请注意预处理不会在运行时发生,'undef'不会在运行时发生。它发生在编译时。 – abyx 2009-11-26 07:49:13

回答

4

你正在做什么是编译时间等同的:

int x = 1; 

int main() 
{ 
    if (x) 
    { 
     ... 
     x = 0; 
    } 
    else 
    { 
     ... 
    } 
} 

IFDEF等情况的发生在编译的时候,但你的例子,这不是一个问题。一旦你评估了if(运行时或者构建时间的形式),就决定采取哪个分支。做出决定后做出改变并不会改变这一决定。

+0

编译之前是否预处理了#ifdef? – 2009-11-26 13:45:11

+0

@Suresh - 是的,预处理确实发生在编译之前。但是由于编译器会自动调用pr处理器,所以我认为这些区别对于这些问题是非常重要的。也就是说,我会改变我的答案,使用“构建时间”而不是“编译时间”来更准确。 – 2009-11-26 17:09:05

3

#define只在预处理过程中起作用。所以

#define PROC_ADD 
void main(void) 
{ 
#ifdef PROC_ADD 
// Do this code here then undefined it to run the code in the else 
// processing work 
#undef PROC_ADD 
#else 
// now that PROC_ADD has been undefined run this code 
// processing work 
#endif 
} 

将被处理方式如下:由于PROC_ADDR定义预处理器将完全排除#else分支,然后执行#undef,所以#else分支代码永远不会生存预处理和永远不会到达编译器。

3

ifdef条件在预处理器达到它时评估。当您在ifdef'd代码中执行undefPROC_ADD时,预处理器已经决定要包含哪个代码段以及要忽略哪个代码段。

此外,是:ifdef,undef等在预处理时被处理 - 编译器甚至不会看到这些所谓的指令。这当然意味着运行时代码从来不会看到这些指令。

编辑:预处理器通过对文本文件进行一次遍历来工作。预处理器甚至不关心你的文本文件恰好包含C代码!它对你的ifdef s和else s以及没有发生在while循环中的零知识毫无知识。

2

所以你想让第二个评论部分代表的代码为总是运行?为什么不只是做

#ifdef PROC_ADD 
// Do the stuff to be done if PROC_ADD is defined 
#undef PROC_ADD 
#endif 
// Do the stuff to always be done 

编辑

OK - 如果你想运行时的行为变化,你必须使用运行时结构(如一个变量作为标志)。正如我们所说的那样),在编译时,预处理器指令只进行一次评估。

+0

我编辑了我的帖子。这只是一个简短的例子。但是,代码本身会循环运行。但是,在第一个循环中,我想运行第一个if语句。然后在第二个和以后的循环中,我不会不进入if,而是进入else。谢谢。 – ant2009 2009-11-26 07:48:02

2

几乎在每种编程语言或语法中,一旦执行已经进入条件的一个分支(在这种情况下,条件是#ifdef,即使条件在分支执行期间改变,其他分支也不会执行。

我敢肯定,你不会想到这个打印“你好”,你会吗?

if (i == 1) 
    i = 0; 
else 
    printf("Hello\n"); 

基本上你的意思是,else分支下的代码应该始终执行,那么就把它从一个分支中拿出来,并且直接把它放在鳕鱼里e

编译器和执行都只进行一次条件通过,一旦找到匹配,他们就不再进一步查找了。

1

想想这样说:尽管x已经在if部分被设置为false不执行下面的代码的else部分。

该条件在if(x)行本身进行检查 - 一旦它进入该块,它不会重新计算每个后续else部分 - 编译器已经做出了决定。

bool x = true; 
if(x) 
{ 
    //do something 
    x = false; 
} 
else 
{ 
    //else code 
} 
相关问题