Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有人能解释c-macro';定义了本地到功能和全局?_C - Fatal编程技术网

有人能解释c-macro';定义了本地到功能和全局?

有人能解释c-macro';定义了本地到功能和全局?,c,C,我不知道为什么会出现这种输出以及预处理器的行为 输出: the value in main 10 the value in fun 20 the value in 2 main 10 来源 #include<stdio.h> #define MAX 10 int fun(int a); int main() { int a; a=MAX; printf("the value in main =%d\n",a); fun(a); int b

我不知道为什么会出现这种输出以及预处理器的行为

输出:

the value in main 10
the value in fun 20
the value in 2 main 10
来源

#include<stdio.h>
#define MAX 10

int fun(int a);

int main()
{
    int a;
    a=MAX;
    printf("the value in main =%d\n",a);
    fun(a);
    int b;
    b=MAX;
    printf("the value in 2 main =%d\n",b);    /*<----doubt at this line*/
}

当然,您已经在main函数之后编写了fun函数的代码


编译器按照在源代码中找到相应值的顺序而不是按照执行顺序更改定义的宏的相应值。

当然,您已经在main函数之后编写了fun函数的代码


编译器按照在源代码中找到宏的顺序(而不是按照执行顺序)更改其相应值的定义宏。

在运行时不会检查宏。在编译之前的一个称为预处理的阶段,会对其进行检查


因此,编译器首先处理
main
函数,并在所有行中将
MAX
替换为10。然后,当它到达
fun
函数时,它取消定义
MAX
并用20重新定义它,并用20替换
fun
中的行。

宏在运行时不被检查。在编译之前的一个称为预处理的阶段,会对其进行检查


因此,编译器首先处理
main
函数,并在所有行中将
MAX
替换为10。然后,当它到达
fun
函数时,它取消定义
MAX
并用20重新定义它,并用20替换
fun
中的行。

这是一个文件吗?文件中主要和有趣的顺序是什么?不清楚你的问题是什么。您可能想了解宏是什么以及预处理器是如何工作的。提示:它没有作用域的概念。是的,在单个文件中的所有内容都只在main()中,我正在调用fun()。这些内容都在一个文件中吗?文件中主要和有趣的顺序是什么?不清楚你的问题是什么。您可能想了解宏是什么以及预处理器是如何工作的。提示:它没有作用域的概念。是的,在单个文件中的所有内容仅在main()中调用fun()…并在编译单元的所有后续行中使用
20
for
MAX
。但在函数中,我正在更改MAX的值。在函数中重新定义后,为什么它不是在main中的反射?max值替换为新值wright?正如我所说,宏在运行时不会被替换。这意味着它不遵循程序执行,而是遵循宏在文件中定义的顺序。要了解这一点,您可以在main上方编写
fun
函数,但在
#define MAX 10
下方编写。在这种情况下,所有printf语句的值都是20…,并在编译单元的所有后续行中使用
MAX
的值
20
。但在函数中,我正在更改MAX的值。为什么在函数中重新定义后,它在main中不是反射?max值替换为新值wright?正如我所说,宏在运行时不会被替换。这意味着它不遵循程序执行,而是遵循宏在文件中定义的顺序。要了解这一点,您可以在main上方编写
fun
函数,但在
#define MAX 10
下方编写。在这种情况下,所有printf语句的值都是20。
int fun(int a)
{
#undef MAX
#define MAX 20
    a=MAX;
    printf("the value in 2 main =%d\n",a);
}