我认为由最权威的程序员之一 (Richard Stallman) 编写的最著名的操作系统 (linux) 中最常用的系统函数之一 ( ls
) 可能是编写得非常好的代码的一个例子。
所以,既然是开源的,我决定看看代码(参见例如 here )。在那里我发现了在 main()
之后定义的几个函数,因此在他们的电话之后,我预计这种情况非常罕见。
有经验的 C 程序员会对此发表评论吗?
最佳答案
斯托曼在这里所做的绝对没有错。
C 语言允许 forward declaration之后定义的函数。
这有很多优点,不应被视为不良行为,而是非常好的行为。
优点(并非详尽无遗):
- 让程序员快速了解 C 代码公开的 API,而无需查看所有代码
- 允许使用头文件,您可以在其中声明一个将在稍后在编译过程中定义的函数。这样你就不必每次使用它时都定义你的函数..
在这种情况下ls
实现时,他只是预先声明了他将在 main()
中使用的函数,但仔细一看,main函数是第一个出现的。
这很可能是为了可读性,这样您就不必一直向下滚动才能到达程序的入口点。
请注意,词汇在这里很重要:
- 函数声明的意思是:只是告诉编译器,在你的代码中的某处,将定义一个同名的函数。
- 函数定义:实际的函数实现
int my_function( char *text); // function declaration, no implementation
int main( int argc, char **argv)
{
return my_function(argv[0]); // use of the declared function
}
// actual function definition / implementation
int my_function( char *text )
{
printf("%s\n", text);
}
编辑 : 仔细查看代码后,您可以看到 Stallman 并没有预先声明他的所有函数。他还有一种相当奇怪的定义函数的方式。我将此归因于代码的陈旧性,该代码的日期为 1985 年,当时 C 编译器的定义不如今天。
在声明或定义之前,它必须允许这种函数的使用。
最后但并非最不重要的是,
ls
的最新版本源代码可以在这里找到:http://coreutils.sourcearchive.com/documentation/7.4/ls_8c-source.html ,与 '85(Back-to-the-Future)版本相比,具有更多符合 C99 的编码。
关于c - 为什么在 main() 之后有函数定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6152048/