在函数中定义宏值

时间:2017-07-12 05:32:04

标签: c

以下两个程序会给出不同的结果。我认为这两个程序应该给出与20..20相同的结果,因为宏定义在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 
}

B:结果是30..30

# include <stdio.h>
# define i 20

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

main()
{
    printf("%d..", i);
    fun();
    printf("%d", i);
}

2 个答案:

答案 0 :(得分:5)

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

现在,因为它是编译过程中的一个单独步骤,所以与为i分配不同的值不同。当您的代码运行时,它会将i视为20,因为它是在main之前定义的。但是,正如我所说,这是一个单独的步骤,它并不关心函数范围,因此,主(i=20)和 >主之后(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;
}

您可以在此Q&A

中找到更多信息

答案 1 :(得分:0)

defines are preprocessed before the compilation and they are global. If you want to assign a value in the function just use normal C assign operator & the a global variable,.