Hal*_*ier 2 c unix open-source
我认为ls最权威的程序员之一(Richard Stallman)编写的最着名的操作系统(linux)之一最常用的系统函数()之一可能是编写得非常好的代码的一个例子.
因此,作为开放源代码,我决定查看代码(参见此处).在那里我发现了几个函数main(),因此在他们调用之后定义,我希望这是非常罕见的.
有经验的C程序员会对此发表评论吗?
Gui*_*i13 10
斯托曼在这里做的事情绝对没有错.
C语言允许向前声明将在之后定义的函数.
这有许多优点,不应被视为不良行为,而是非常好的行为.
优点(并非详尽无遗):
- 让程序员快速查看C代码公开的API的愿景,而不必查看所有代码
- 允许使用头文件,您可以在其中声明将定义的函数稍后在编译过程中.这样您每次使用时都无需定义功能.
在这个ls实现的情况下,他只是预先声明了他将在其中使用的函数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);
}
Run Code Online (Sandbox Code Playgroud)
编辑:仔细查看代码后,您可以看到Stallman没有向前声明他的所有功能.他还有一种相当奇怪的定义函数的方式.我将这归因于代码的旧版本,该代码的日期是1985年,当时C编译器的定义不如今天.它必须在声明或定义之前允许这种函数使用.
最后但并非最不重要的是,最新版本的ls源代码可以在这里找到:http://coreutils.sourcearchive.com/documentation/7.4/ls_8c-source.html,
具有比'85更多符合C99标准的编码(返回 -到了未来的版本.