2017-02-23 75 views
-2

我得到含有声明若干功能的大C文件如下:Ç - void函数(无效),参数和返回值

static void function_a(void) { .... } 

void function_a(void); 

功能被主程序上面写

在主程序调用这些函数为:

function_a(); 

现在据我知道functi上面声明的声明既不使用参数,也不具有返回值。然而,在这些函数中使用了变量和数组,这些函数并没有在这些函数中定义,而只在主程序中定义。

这真的是正确的C语法?如果函数不作为参数传递,函数如何从主程序访问数据?

此外,主程序使用变量,这些变量是在它调用的函数内计算的。

+3

它们是在主函数*还是在*文件*中定义的? – StoryTeller

+0

对不起,我刚刚编辑。它们在主函数 –

+3

上方的文件中定义。请发布一个完整的示例而不是片段。 – Lundin

回答

5

请问您能提供更多的上下文吗?在C中,你不能访问另一个函数的变量,但你可以访问全局变量。

以下程序是有效的,将输出3,因为i是一个全局变量,并且随处可见。

#include <stdio.h> 

int i = 2; 

void plusone() { 
     i = i + 1; 
} 

int main() { 
     plusone(); 
     printf("i = %d\n", i); 
} 

另一方面,下面的程序将无法编译,因为i是本地main()功能,是看不见的其他地方。

#include <stdio.h> 

void plusone() { 
     i = i + 1; 
} 

int main() { 
     int i = 2; 
     plusone(); 
     printf("i = %d\n", i); 
} 

说的是,全局变量的使用是一个不好的做法,应该避免。

+0

好的。如果我有另一个只包含变量定义的C文件,并将该文件链接到包含主程序和其他功能的C文件,该怎么办?单独的C-File中的变量是否也是全局变量? –

+3

@ J.M。你将不得不声明这些变量为'extern',以便你可以使用它们。 –

0

所以这个:

//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_bfile_b.c中被声明为具有静态文件范围,但对于其他翻译单元而言,该功能只是“不存在”。现在

,以声明的变量只是function_b之前,我把他们有点像这样:

//file_a.c 
int array[10]; 
void function_a(void) 
{ 
    //... 
} 

这只是声明了一个全局变量。它可以通过file_a.c中的所有函数访问,只要它们在之后出现声明。它也可以使用其他翻译单元(如file_b.cfile_z.c)如果你声明它是这样的:

//file_b.c 
extern int array[10]; 

当你编译一切togheter,在翻译单元声明与file_b.c开始将告诉编译器array不是该file_b.c中的文件范围变量;相反,编译器将不得不在另一个翻译单元中查找该变量,然后将它们链接在一起,以便所有函数对10个整数的块执行相同的操作。

0

在C中,根本不可能访问另一个函数或范围的局部变量。 代码编译是否正确?如果是这些变量必须是全局定义的,或者在开头或某个头文件中。 如果不使它们成为全局的,则可以从非参数函数访问。

+0

另一个函数有另一个范围,所以你的第一句话有点多余。 –

+1

当然你可以访问你的父范围的变量。 – unwind