C++中的声明和定义有何不同?

5

我很模糊在声明和定义规则方面的区别。

我在funcs.h中有以下声明:

void sumTotalEnrgyAndClush(Protein &A,Protein &B,double ans[2],double enrgyA[18][18],double     enrgyB[18][18]);

请注意,ans[2]在enrgyA和B之前。
在funcs.cpp文件中,定义如下:
void sumTotalEnrgyAndClush(Protein &A,Protein &B,double enrgyA[18][18],double enrgyB[18][18],double ans[2])

它(通过makefile)编译并正常工作。

我还注意到,如果我删除声明,编译器似乎也能处理得很好。

为什么参数的顺序变化不重要?是因为最后3个项目都是指针,所以顺序的差异无关紧要吗?


可能是什么是定义和声明的区别?的重复问题。 - sbi
2
不是重复问题,实际上是一个有趣的问题。 - Tyler McHenry
顺序的变化确实很重要。编辑:詹姆斯·麦克尼利斯在他的回答中表达得更好。 - Philip Potter
一个非常好而且有趣的问题。 - Kangkan
1个回答

12
为什么参数的顺序不重要?
参数的顺序是有影响的。在C++中,函数可以被重载,因此如果它们具有不同的参数(或者如果它们是成员函数并且它们在const限定符方面不同),则两个或多个函数可以具有相同的名称。
实际上,您声明了两个 `sumTotalEnrgyAndClush` 函数。头文件中的声明声明了一个从未定义的函数,源文件中的声明声明并定义了另一个函数。
如果您尝试使用在头文件中声明的函数(例如通过调用它或取其地址),则会出现错误,因为该函数未定义。

最初使我困惑的是,尽管你在最后一句话中提到了什么,但我的程序仍然可以运行。后来我注意到,在我的main.cpp文件中有一个额外的定义与funcs.h文件中的声明匹配。 但是你的答案对我的通用知识是一个很好的补充。 谢谢。 - Meir
1
@Dave:如果你坚持遵循一套规则,其中定义在头文件中声明的事物(例如x.h中的所有内容都在x.cpp中定义),那么你就不会出现同一事物的多个(不同)定义。一旦你进入一个真正大型的项目(数千个源文件),你就需要这个,否则你永远无法找到自己的方向。 - sbi

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