C-无效函数(void)、参数和返回值
我得到了一个大型C文件,其中包含几个声明如下的函数:C-无效函数(void)、参数和返回值,c,syntax,parameters,return-value,void,C,Syntax,Parameters,Return Value,Void,我得到了一个大型C文件,其中包含几个声明如下的函数: void function_a(void); 这些函数写在主程序上方: static void function_a(void) { .... } 在主程序中,这些函数称为: function_a(); 现在据我所知,上面声明的函数既不使用参数,也没有返回值。但是,在这些函数中使用了变量和数组,这些变量和数组不是在这些函数中定义的,而是仅在主程序中定义的 这真的是正确的C语法吗?如果未作为参数移交,函数如何从主程序访问数据 此外,主程序
void function_a(void);
这些函数写在主程序上方:
static void function_a(void) { .... }
在主程序中,这些函数称为:
function_a();
现在据我所知,上面声明的函数既不使用参数,也没有返回值。但是,在这些函数中使用了变量和数组,这些变量和数组不是在这些函数中定义的,而是仅在主程序中定义的
这真的是正确的C语法吗?如果未作为参数移交,函数如何从主程序访问数据
此外,主程序使用变量,这些变量在其调用的函数中计算 你能提供更多的上下文吗?在C语言中,不能从另一个函数访问变量,但可以访问全局变量 以下程序有效并将输出3,因为
i
是一个全局变量,在任何地方都可见
#include <stdio.h>
int i = 2;
void plusone() {
i = i + 1;
}
int main() {
plusone();
printf("i = %d\n", i);
}
也就是说,使用全局变量是一种不好的做法,应该避免使用。因此:
//file_a.c
void function_a(void)
{
//...
}
使函数成为一个不接受任何参数且不返回任何值的函数。此函数可由声明的同一文件函数\u 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\u b
成为不接受任何参数且不返回任何值的函数,就像function\u a
一样。但是,它还表示,函数b
在翻译单元中具有静态文件作用域,该翻译单元开始或包括文件b.c
。这意味着它不能被其他翻译单位访问
因此,如果您现在尝试在文件_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
由于每个文件{a,b,z}.c
都是(或可能应该是)它们各自独立翻译单元的起点,并且函数{u b
是在文件{u b.c
中用静态文件范围声明的,因此对于其他翻译单元,该函数根本“不存在”
现在,对于在函数\u b
之前声明的变量,我认为它们看起来有点像这样:
//file_a.c
int array[10];
void function_a(void)
{
//...
}
//file_b.c
extern int array[10];
它只是声明了一个全局变量。只要它们出现在声明之后,文件_a.c
中的所有函数都可以访问它。如果您这样声明它,它也可以被其他翻译单元(如file_b.c
或file_z.c
)使用:
//file_a.c
int array[10];
void function_a(void)
{
//...
}
//file_b.c
extern int array[10];
当您一起编译所有内容时,翻译单元中以file_b.c
开头的声明将告诉编译器array
不是该file_b.c
中的文件范围变量;相反,编译器必须在另一个翻译单元中查找该变量,然后将它们链接在一起,以便所有函数对该10个整数块执行相同的操作。在C中,根本不可能访问另一个函数甚至作用域的局部变量。
代码编译正确吗?如果是,这些变量必须在开始文件或某些头文件中全局定义。
如果不将它们设置为全局,以便从非参数函数访问。它们是在主函数中定义的,还是在文件中定义的?对不起,我刚刚编辑过。它们是在主函数上方的文件中定义的。请发布一个完整的示例,而不是片段。您知道静态作用域的变量是什么吗?如果变量定义为“高于”main()
和“高于”function\u a()
,并且所有变量都在同一文件中,则可以从这两个函数访问变量。任何关于C的基础教科书都会告诉你,好的。如果我有另一个只包含变量定义的C文件,并将此文件链接到包含主程序和其他函数的C文件,该怎么办。单独C文件中的变量也是全局变量吗?@J.M.您必须将这些变量声明为extern
,以便使用它们。另一个函数有另一个作用域,因此您的第一句话有点多余。当然,您可以访问父作用域的变量。