多个源程序组成程序编译问题

来源:互联网 发布:linux基础教程第二版 编辑:程序博客网 时间:2024/05/21 09:18

在所有函数之外定义声明的变量被默认为静态存储类型并被视为全局变量。全局变量可以被同一个文件中位于变量声明之后定义的任何函数访问。全局变量还可以被其他文件中的函数访问,若要做到这点,必须在使用全局变量的每一个文件中对这些全局变量进行声明。例如,若一个文件想利用另一个文件中声明的全局变量flag,那么该文件中必须包含以下语句在使用flag之前:

extern int flag;

编译器将通知链接程序,本文件中出现了对变量flag的未定值的引用,如果链接程序找不到变量flag的定义,那么就会发出一条出错信息,并且不生成可执行文件。如果链接程序找到了正确的全局变量的定义,那么就以变量flag的位置来确定那些未定值的引用。
函数原型也可以将它的作用域扩展到定义它的文件之外(函数原型并不需要extern说明符)。为了达到这个目的,只需简单的将函数原型包含在每一个想调用它的文件中,然后将这些文件一起编译即可(include)。函数原型会告诉编译器其指定的函数要么在本文件后面定义,要么在另外一个文件中定义。同样,编译器并不尝试确定对这个函数的引用,链接器来完成。如果链接器找不到,则会发出一条错误信息。
实际可能需要将一个全局变量或者一个函数的作用域限定在定义它的文件之内,将存储类型说明符static应用于全局变量或函数时,就可以阻止在本文件之外定义的函数访问它们。这被称为内部链接(internal linkage)。在定义前没有加上static的全局变量或者函数就是外部链接(external linkage)–如果在其他文件中包含了适当的声明或函数原型,那么在这些文件中是可以被访问的。
全局变量的声明:

static const double PI = 3.14159;

说明符static通常用在仅能被特定文件中的函数所调用的实用函数中。

0 0