C++函数原型?

3

这里有一个新手问题,但我没有老师...所以...无论如何我们继续:

我想知道是否有必要在文件顶部具有函数原型,而不是将main函数放在文件末尾并在文件顶部创建所有函数。据我所知,VC++和G++都没有抱怨。是否有标准禁止我这样做?

当你更改函数参数和返回类型时,不得不更改原型似乎相当烦人。

示例:

#include <iostream>

void say_hi(){
    std::cout << "hi" << std::endl;
}

int main(){
    say_hi();
    return 0;
}
3个回答

4
这段代码声明了但并未定义函数say_hi:
void say_hi();

这既声明了函数say_hi,又定义了它:

void say_hi(){
    std::cout << "hi" << std::endl;
}

你可以多次声明一个函数,但只能定义一次。
在调用函数之前,必须在文件中声明函数。函数必须被定义在同一个文件中,在调用函数之前或之后,甚至可能在另一个文件中定义。
所以,是的,这是完全可以的。

那么我们为什么还需要函数原型呢? - Pwnna
@ultimate 适用于递归调用。间接递归、可以容纳自身的容器等都需要原型,以便它们可以稍后引用自己或自己的派生物。 - Blindy
那么最好把原型放在那里?虽然现在看起来仍然很烦人,但我已经习惯了这样做。(附带问题:IDE 是否可以在某种程度上消除这种烦恼?) - Pwnna
如果您需要在多个源文件中使用一个函数,则应在头文件中声明该函数,并在单个源文件中定义它(由于Dennis提到的“一个定义规则”,您只能定义一次,但可以声明任意次数)。如果您仅在单个源文件中使用一个函数,我认为您应该尽可能在文件顶部的未命名命名空间中声明和定义它(namespace { void foo() { } })。 - James McNellis
我承认在这里询问最佳实践并不是向我提问的最佳人选:我有将所有东西都变成模板的倾向,因此我的大部分代码(98%以上)最终都会出现在头文件中。 - James McNellis
显示剩余5条评论

2

你说得对,如果你在函数调用的位置之前定义了所有的函数,那么你就不需要函数原型。实际的函数定义和单独的声明有着相同的目的。


1

当你有小型函数时,这个方法是有效的。但是当函数变得很长或者你有多个代码文件时,它的效果就不如预期了。作为一种风格,许多老师要求即使是小型应用程序也要采用适合大型应用程序的结构来编写。


当say_hi()有400行长,并且还有许多其他长函数时,在其中找到main()是一项挑战。因此,最终大多数C ++开发人员都有多个文件,头文件等。由于那是人们最终停留的地方,因此有些人会教你从这样开始,即使您看不到这样做的原因。问题问“这可以吗?”它可以,但有些人可能会建议您以不同的方式执行。我想我知道他们为什么这样说。 - Kate Gregory
函数length与文件分割有什么关系?老师们又与此有何关联?你的思维方式真的很冗长。 - Blindy
如果有人坚持编写2000行的函数,那么其中一些内容将会很难找到。我认为问题并不是出在有多少可怕的函数或它们出现在了多少个文件中,而是出在是否存在这些函数中。但既然你问了,我的文本编辑器里“跳转到匹配括号”的快捷键是CTRL+B。我建议写长函数的人:(a)了解他们文本编辑器里的功能,(b)不要再写那么长的函数啦 :-) - Steve Jessop
1
@Blindy:公平地说,良好的文件结构确实有助于找到函数定义,如果一直保持一致的话。mainmain.cpp的顶部,say_hisay_hi.cpp的顶部等等。同样,如果say_hisay_hi.h中定义,也有助于找到函数定义 - 但是在项目变得足够大以至于您想将某些函数移动到.cpp文件中时,它同样有帮助。我很容易相信老师们倾向于要求早期完成此操作。 - Steve Jessop
@Steve 这与函数原型仍然没有关系。而且当你将类引入其中时,情况会变得更加复杂 :) - Blindy
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接