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