2

我有以下代码

#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

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

4

6 回答 6

4

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

int x = 1;

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

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

于 2009-11-26T07:48:33.763 回答
3

#defines 仅在预处理期间工作。所以

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

于 2009-11-26T07:38:15.577 回答
3

ifdef预处理器到达条件时,条件被评估。当您undef PROC_ADDifdef'd 代码中时,预处理器已经决定要包含哪些代码部分以及要忽略哪些部分。

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

编辑:预处理器通过单次遍历文本文件来工作。预处理器甚至不关心你的文本文件是否包含 C 代码!它对你ifdef的 s 和elses 以及诸如此类的东西碰巧在一个while循环中的知识为零。

于 2009-11-26T07:38:59.070 回答
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

编辑

好的——如果你想改变运行时行为,你必须使用运行时结构(比如一个变量作为一个标志)。正如我们都说的;),预处理器指令仅在编译时评估一次。

于 2009-11-26T07:39:02.080 回答
2

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

我敢肯定你不会期望这会打印“Hello”,对吗?

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

基本上你说的就是else分支下的代码应该一直执行,然后把它从一个分支里拿出来,直接放到代码里面

编译器和执行都只通过条件语句,一旦找到匹配项,它们就不会再看下去了。

于 2009-11-26T07:47:43.500 回答
1

可以这样想:else即使在该部分x中设置为,以下代码的一部分也不会执行。falseif

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

bool x = true;
if(x)
{
  //do something
  x = false;
}
else
{
  //else code
}
于 2009-11-26T07:52:27.187 回答