#define,#ifdef #undef #endif

问题描述 投票:0回答:6

我有以下代码

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

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

c visual-studio-2008 c-preprocessor preprocessor-directive
6个回答
5
投票

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

int x = 1;

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

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


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


3
投票

当预处理器到达

ifdef
条件时,就会对其进行评估。当您在
undef
代码中
PROC_ADD
ifdef
时,预处理器已经决定要包含哪一段代码以及忽略哪一段代码。

此外,是的:

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

预处理器通过一次遍历文本文件来工作。预处理器甚至不关心您的文本文件恰好包含 C 代码!它对您的

ifdef
else
以及其他发生在
while
循环内的知识为零。


2
投票

几乎在每一种编程语言或语法中,一旦执行进入条件语句的一个分支(在本例中,条件语句为

#ifdef
,即使在分支执行过程中条件发生变化,其他分支也永远不会被执行。

我确信你不会期望它打印出“Hello”,对吗?

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

基本上你的意思是,

else
分支下的代码应该始终执行,然后将其从分支中取出,然后将其直接放入代码中

编译器和执行都只通过条件一次,一旦找到匹配,它们就不会再寻找。


2
投票

那么您希望第二个注释部分表示的代码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

编辑

好的 - 如果您想要更改运行时行为,则必须使用运行时构造(例如用作标志的变量)。正如我们都说的;),预处理器指令仅在编译时评估一次。


1
投票

这样想:即使

else
部分中的
x
已设置为
false
,以下代码的
if
部分也不会执行。

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

bool x = true;
if(x)
{
  //do something
  x = false;
}
else
{
  //else code
}
© www.soinside.com 2019 - 2024. All rights reserved.