所以这个:
//file_a.c
void function_a(void)
{
//...
}
使function_a
不带任何参数,并且不返回任何值的函数。这个函数可能被同一个文件function_a
中的所有其他函数使用,或者在其他任何.c
文件中,您告诉编译器将它们放到最终的程序中。
换句话说,此功能可供您的程序的所有翻译单元访问。如果你有一个名为file_a.c
文件这一功能,你也有被称为另一个文件file_z.c
你可以这样做:
//file_z.c
void function_z(void)
{
function_a();
}
所有的罚款。
在另一方面,这
//file_b.c
static void function_b(void)
{
//...
}
(我改名为清楚起见功能)
使function_b
不带任何参数,并且不返回任何值,就像function_a
功能。但是,它也表示function_b
在翻译单元中具有静态文件范围,该范围始于或包含file_b.c
。这意味着它不能被其他翻译单元访问。
所以,如果你现在试图做到这一点file_z.c
:
void function_z(void)
{
function_b();
}
你会得到编译错误:
file_z.c:(.text+0xa): undefined reference to `function_b'
collect2: error: ld returned 1 exit status
因为每个file_{a,b,z}.c
是(或可能应该是)的起点,其拥有单独的翻译单元,并且function_b
在file_b.c
中被声明为具有静态文件范围,但对于其他翻译单元而言,该功能只是“不存在”。现在
,以声明的变量只是function_b
之前,我把他们有点像这样:
//file_a.c
int array[10];
void function_a(void)
{
//...
}
这只是声明了一个全局变量。它可以通过file_a.c
中的所有函数访问,只要它们在之后出现声明。它也可以使用其他翻译单元(如file_b.c
或file_z.c
)如果你声明它是这样的:
//file_b.c
extern int array[10];
当你编译一切togheter,在翻译单元声明与file_b.c
开始将告诉编译器array
不是该file_b.c
中的文件范围变量;相反,编译器将不得不在另一个翻译单元中查找该变量,然后将它们链接在一起,以便所有函数对10个整数的块执行相同的操作。
它们是在主函数*还是在*文件*中定义的? – StoryTeller
对不起,我刚刚编辑。它们在主函数 –
上方的文件中定义。请发布一个完整的示例而不是片段。 – Lundin