c - 为什么在 main() 之后有函数定义?

标签 c unix open-source

我认为由最权威的程序员之一 (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/

相关文章:

c - 为什么字符串末尾的 '\b' 没有作用?

unix - 如何使用 Unix 命令收集文本文件中的字符使用统计信息?

open-source - 我们是否通过在开源项目上工作来踢自己的脚?

python - 使用 Django 构建金融应用程序

architecture - 用于 build /设计房屋的开源软件?

c++ - 如何以跨平台的方式在C中获取环境变量

c - 数据类型修饰符和移位运算符

使用 GNU 工具链 (gcc/ld) 从静态库创建共享库

bash - 使用 os.system 正确处理从 Python 转义的 shell

linux - 在 Linux 中用 sed 替换点、感叹号和问号