c - 在函数中定义宏值

标签 c

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

A:结果是 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);
}

最佳答案

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

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

尝试在主函数中使用#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 中找到更多信息

关于c - 在函数中定义宏值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45049135/

相关文章:

c - 汇编代码的长度可以表示执行速度?

c - 如何通过更改SQLite3中现有的SQL表来通过单个SQL语句添加更多列?

c - 什么是基准测试和压力测试子字符串搜索算法的好测试用例?

C 在 scanf() 处无限循环

c++ - 打印无符号字符指针内的值

c - 为什么 fseek 和 fputc 在我的程序中不起作用?

AtMega32U4中产生PWM脉冲的代码

c - 在 Contiki 程序中使用 malloc

c - 我的反向字符串函数有问题

c - printf (_ ("hello, world\n")) 是什么意思?