#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
,预处理器已经决定要包含哪些代码段以及要忽略哪些代码段。
此外,是的: ifdef
, undef
等在预处理时处理 – 编译器甚至从未看到这些所谓的指令。 这当然意味着运行时代码也永远不会看到这些指令。
编辑 :预处理器通过单个传递文本文件来工作。 预处理器甚至不关心您的文本文件恰好包含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 }