C 在函数中定义宏值

C 在函数中定义宏值,c,C,下面两个程序给出了不同的结果。我认为这两个程序应该给出与20..20相同的结果,因为宏define在fun()中,它不应该影响fun()的外部。你能解释一下原因吗 结果是20..20 # include <stdio.h> # define i 20 void fun(); main() { printf("%d..", i); fun(); printf("%d", i); } void fun() { #undef i #define

下面两个程序给出了不同的结果。我认为这两个程序应该给出与20..20相同的结果,因为宏define在fun()中,它不应该影响fun()的外部。你能解释一下原因吗

结果是20..20

# include <stdio.h>
# define i 20
void fun();
main()
{
    printf("%d..", i);
    fun();
    printf("%d", i);
}

void fun()
{
    #undef i 
    #define i 30 
}
#包括
#定义i 20
虚无乐趣();
main()
{
printf(“%d…”,i);
乐趣();
printf(“%d”,i);
}
虚无乐趣()
{
#未定义i
#定义i 30
}
结果是30..30

# include <stdio.h>
# define i 20

void fun()
{
#undef i 
#define i 30 
}

main()
{
    printf("%d..", i);
    fun();
    printf("%d", i);
}
#包括
#定义i 20
虚无乐趣()
{
#未定义i
#定义i 30
}
main()
{
printf(“%d…”,i);
乐趣();
printf(“%d”,i);
}

C预处理器不是编译器的一部分,而是编译过程中的一个单独步骤

现在,因为这是编译过程中的一个单独步骤,所以它与为
i
分配不同的值不同。当代码运行时,它将
i
视为
20
,因为这是在
main
之前定义的。但是,正如我所说,这是一个单独的步骤,它不关心函数的作用域,因此,在main之前(
I=20
)和main之后(
I=30
)。当预处理器运行时,它将整个范围视为全局范围

尝试在main中而不是在函数中使用
#define
,然后检查发生了什么

例如:

void f(){
    #define a 5
    printf("%d\n", a);
    #undef a
    #define a 10
    printf("%d\n", a);
}

int main()
{
    printf("%d\n", a); // a can be printed even though f() was never called!!
    #define i 20
    printf("%d\n", i); // 20
    #undef i
    #define i 30
    printf("%d\n", i); // 30! :)
    return 0;
}

您可以在此

中找到更多信息。定义在编译之前进行了预处理,并且是全局的。如果要在函数中赋值,只需使用普通的C赋值运算符&a全局变量。

宏定义为全局变量。不管您是否在函数中定义它。预处理器将替换第一次出现的宏,并将继续。