C-无效函数(void)、参数和返回值

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语法吗?如果未作为参数移交,函数如何从主程序访问数据 此外,主程序

我得到了一个大型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
,以便使用它们。另一个函数有另一个作用域,因此您的第一句话有点多余。当然,您可以访问父作用域的变量。