繁体   English   中英

在 function 之后声明全局变量

[英]Declare global variable after function

为什么我们需要在 function 定义和声明之前声明全局变量,因为我们在这个变量声明之后调用这个 function? 不是编译器逐行读取的吗? 我的意思是在调用 function 编译器时应该知道什么是 x。

void function()
{
    x += 3
}


int x = 3;

int main(void)
{
   function();
   return 0;
}

还有一个问题。 我知道我们可以在 main function 之后定义 function,前提是我们在 main 之前声明了这个 function。 那么主function在主function之后怎么看到这些功能呢? 编译器是否首先读取整个文件然后运行 main() 或某事?

你可以这样思考编译器的工作; 它逐个标记(不完全是逐行)读取源文件标记,当读取到足够的标记时,它会输出翻译。 它重复这一点,直到源文件(正确)完成:编译器的工作完成。

对于编译器读取的每个标记,它需要知道标记代表什么。 如果它不知道,则会产生错误。

所以,在编译你的 function

void function()
{
    x += 3
}

它遇到一个“x”,但不知道它代表什么(一个 integer?一个浮点数?还有什么?)。 -错误-。

为什么function定义和声明之前需要声明全局变量

声明定义是两个不同的东西。 编译器需要声明才能知道如何管理标识符; 真正的定义可以在其他地方,甚至在另一个源(或已经编译的)文件中。

还有一个问题。 我知道我们可以在 main function 之后定义 function,前提是我们在 main 之前声明了这个 function。 那么主function在主function之后怎么看到这些功能呢? 编译器是否首先读取整个文件然后运行 main() 或某事?

如前所述,编译器所需要的只是一个声明,因此它可以 output 正确( object )代码。 如果先声明function(),然后定义main(),再定义function(),编译器就有足够的能力生成正确的output,它将由main()的代码和function()的代码组成(我们可以说“在这个命令”)。 下一步,linker,将注意连接这两个功能。

function() 的定义也可能不存在:编译器仍然会为 main() 生成正确的代码; linker 会抱怨,除非你告诉它在哪里可以找到 function() 的定义/实现。

另请注意,定义也是声明。 因此,如果您在源代码中声明了 function(),然后声明了 main(),则不需要前向声明。

在我读到的评论中,也许您将解释器与编译器混淆了-这是真的,如果您尝试将 Python 与 C 进行比较:非常不同的野兽。 一个很大的区别是编译器与解释器,编译器生成数据(目标代码)但不链接它(也不运行它)。 相反,解释器是编译器+链接器+运行时,全部打包在一起。 通常,编译器生成的代码比等效的解释程序要快得多,但要做到这一点,它需要准确的信息(精确的类型和声明),而且通常(总是?)通用性较差。 解释器通常更通用,但它不能利用一个好的编译器可以做的所有优化。

function定义和声明之前为什么需要声明全局变量,因为我们在这个声明之后调用了这个变量函数?

c 语言是一种严格类型的语言。 当编译器处理一个标识符时,它需要确定其类型以生成正确的 object 代码。

在 function 中使用的全局变量不必在 function 定义之前声明。 但无论如何,它应在 function 中使用之前声明。

这是一个演示程序。

#include <stdio.h>

void function( void )
{
    extern int x;    
    x += 3;
}

int x = 3;

int main( void ) 
{
    function();
    printf( "x = %d\n",  x );

}

程序 output 是

x = 6

这里 function 中声明的变量x指的是 function 之后定义的全局变量 x。

那么主function在主function之后怎么看到这些功能呢? 编译器是否首先读取整个文件然后运行 main() 或某事?

C 是一种编译语言。 它不运行程序。 它生成 object 代码,然后通过 linker 进行一些处理后可以运行。

在使用 function 的地方,编译器需要的是 function 的类型,以检查 function 是否使用正确。 If the function is an inline function then it can substitute its call for the function body It can rebuild the object code when the inline definition in the translation unit will be known.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM