#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运行代码。

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

你正在做的是构建时间相当于:

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

ifdef等在构建时发生,但对于您的示例,这不是问题。 一旦评估了if(运行时或构建时表单),就决定采用哪个分支。 做出决定后改变一些事情并不会改变这个决定。

ifdef条件在预处理器到达时进行评估。 当您在ifdef代码中PROC_ADD ,预处理器已经决定要包含哪些代码段以及要忽略哪些代码段。

此外,是的: ifdefundef等在预处理时处理 – 编译器甚至从未看到这些所谓的指令。 这当然意味着运行时代码也永远不会看到这些指令。

编辑 :预处理器通过单个传递文本文件来工作。 预处理器甚至不关心您的文本文件恰好包含C代码! 它不知道你的ifdef和s以及else碰巧都在while循环中。

#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分支代码永远不会在预处理中存活,永远不会到达编译器。

在几乎所有编程语言或语法中,一旦执行已进入条件的一个分支(在这种情况下,条件为#ifdef ,即使条件在执行分支期间发生变化,其他分支也永远不会被执行。

我相信你不会指望这打印“你好”,对吗?

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

基本上你所说的是else分支下的代码应该总是执行,然后将它从分支中取出,并直接放在代码中

编译器和执行程序只进行一次通过条件,一旦找到匹配,它们就不会再看了。

所以你希望第二个评论部分代表的代码始终运行? 为什么不这样做

 #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 – 如果您想要运行时行为更改,则必须使用运行时构造(例如变量作为标志)。 正如我们所说的那样;),预处理器指令仅在编译时被评估一次。

以这种方式考虑:即使在if部分中将x设置为false ,也不会执行以下代码的else部分。

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

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