我是C编程的新手,但对Python,Java和Perl的经验有限。我只是想知道将main()上面的函数原型和main()下面的函数定义的优点是什么,而不是仅仅在main()上面定义所述函数。根据我的阅读,该定义也可以作为原型。
提前致谢,
答案 0 :(得分:6)
使用main()
以上的原型(在单个模块中)主要取决于个人偏好。有些人喜欢在文件底部看到main()
;其他人喜欢在顶部看到它。我有一位大学教授抱怨说我把我的程序写成“颠倒”,因为我把main()
放在了最底层(避免了为所有东西编写和维护原型)。
有一种情况可能需要原型:
void b(); // prototype required here
void a()
{
b();
}
void b()
{
a();
}
在这个相互递归的情况下,你需要至少有一个原型出现在另一个函数的定义之前。
答案 1 :(得分:3)
当其他人想要使用你的库时,你可以给他们标题(包含原型),而不给他们你的代码。
实施例? Windows SDK。
如果两个函数互相调用,则需要至少有一个函数原型。
对编译的代码没有性能影响。
*注意:嗯,我猜是可以。如果编译器决定将方法放在二进制文件的其他位置,那么理论上你可以看到影响应用程序性能的局部性问题。但是,这并不是通常担心的事情。
答案 2 :(得分:2)
将函数拆分为独立原型和定义没有任何优势。实际上,该方法存在明确且明确的缺点,因为它需要额外的维护工作来保持原型和定义完美同步。因此,合理的方法是仅在拥有时提供单独的原型。例如,使用头文件中声明的外部函数,除了保持原型和定义分开之外别无选择。
对于单个翻译单元内部的函数(我们通常声明的static
),绝对没有理由创建独立的原型,因为函数本身的定义包括原型。只需按自然顺序定义您的函数:首先是低级函数,最后是高级函数,就是这样。如果您的程序包含一个翻译单元,main
函数将最终位于最底层。
在这种方法中,您必须声明独立原型的唯一情况是,如果涉及某种形式的递归。
答案 3 :(得分:1)
如果以正确的顺序编写代码,即main last,那么代码中每个函数只有一个定义。如果需要进行更改,这可以防止必须在两个或更多位置更改代码。这可以防止错误并减少维护错误的工作。该原则称为“single source of truth”