我有以下代码
#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
}
}
但是,它会运行代码。但在
else
未定义后,它不会运行 PROC_ADD
中的代码。
我认为原因可能是您只能在编译时定义和取消定义,而不能在运行时定义和取消定义。不过,我不太确定。
您正在做的构建时间相当于:
int x = 1;
int main()
{
if (x)
{
...
x = 0;
}
else
{
...
}
}
ifdef 等发生在构建时,但对于您的示例来说,这不是问题。一旦评估了 if(运行时或构建时形式),就决定采用哪个分支。做出决定后更改某些内容不会改变该决定。
#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
条件时,就会对其进行评估。当您在 undef
代码中 PROC_ADD
ifdef
时,预处理器已经决定要包含哪一段代码以及忽略哪一段代码。
此外,是的:
ifdef
、undef
等是在预处理时处理的——编译器甚至看不到这些所谓的指令。这当然意味着运行时代码也永远不会看到这些指令。
预处理器通过一次遍历文本文件来工作。预处理器甚至不关心您的文本文件恰好包含 C 代码!它对您的
ifdef
和 else
以及其他发生在 while
循环内的知识为零。
几乎在每一种编程语言或语法中,一旦执行进入条件语句的一个分支(在本例中,条件语句为
#ifdef
,即使在分支执行过程中条件发生变化,其他分支也永远不会被执行。
我确信你不会期望它打印出“Hello”,对吗?
if (i == 1)
i = 0;
else
printf("Hello\n");
基本上你的意思是,
else
分支下的代码应该始终执行,然后将其从分支中取出,然后将其直接放入代码中。
编译器和执行都只通过条件一次,一旦找到匹配,它们就不会再寻找。
那么您希望第二个注释部分表示的代码always运行?为什么不直接做
#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
编辑
好的 - 如果您想要更改运行时行为,则必须使用运行时构造(例如用作标志的变量)。正如我们都说的;),预处理器指令仅在编译时评估一次。
这样想:即使
else
部分中的x
已设置为false
,以下代码的if
部分也不会执行。
在
if(x)
行本身中检查条件 - 一旦进入该块,它就不会重新计算后续的每个 else
部分 - 编译器已经对此做出了决定。
bool x = true;
if(x)
{
//do something
x = false;
}
else
{
//else code
}