#define,#ifdef #undef #endif

时间:2009-11-26 07:36:43

标签: c visual-studio-2008 c-preprocessor preprocessor-directive

我有以下代码

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

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

6 个答案:

答案 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时,预处理程序已经决定要包含哪些代码段以及要忽略哪些代码段。

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

编辑:预处理器通过单个传递文本文件来工作。预处理器甚至不关心您的文本文件恰好包含C代码!它不知道您的ifdefelse以及恰好位于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
}