除非对声明为“静态”的函数有必要,否则是否有人对不使用原型有任何意见。你总是将它们放在翻译单元的顶部吗?我倾向于但最近我一直在考虑为什么不依赖于函数的排序,并且你可以限制函数调用的某些范围,这可能会迫使你自己更多地思考函数的范围。功能。我仍然站在做原型的一边,但我可以看到对于围栏的另一面来说,参数并非完全没有根据。我想这个论点也可以继续用于#define和文件范围变量。
答案 0 :(得分:4)
我尽可能遵循“使用前定义”规则(因此我的文件总是从下往上阅读)。这样我就不必担心保持声明和定义同步,至少在同一个文件中。
要迂腐,你在谈论声明,而不是原型; prototype指的是声明/定义的语法(即,声明参数列表中参数的数量和类型)。为清楚起见,以下声明和定义使用原型语法:
/**
* prototype declaration; the number and types of parameters are
* part of the declaration, so the compiler can do type checking
* on the function call
*/
double f(int x, int y, double z);
/**
* prototype definition
*/
double f(int x, int y, double z)
{
...
}
而以下声明和定义不使用原型语法:
/**
* non-prototype declaration; the number and types of parameters
* are not specified, so the compiler can't do any type checking
* on the function call.
*/
double f();
...
/**
* non-prototype definition; this is still legal AFAIK, but
* *very* outdated, and should no longer be used
*/
double f(x, y, z)
int x;
int y;
double z;
{
...
}
无论是在使用前定义函数,还是在使用前声明并稍后定义,总是使用原型语法。
答案 1 :(得分:2)
我倾向于以Pascal顺序编写函数(即。,在使用前定义)而不是用原型声明。特别是在开发过程中,当签名经常变化时,必须保留两份相同的信息是令人恼火的,并且可能会破裂。
答案 2 :(得分:0)
你必须在C ++中使用一个原型才能看到原型,但不一定是C语言。我更喜欢C语言中的原型函数。没有充分的理由不这样做。原型函数定义就足够了(再次,没有C ++中的非原型函数定义这样的东西),并且我没有看到将函数定义为尽可能接近其使用点(即刚好在其首次使用之上)的任何错误并依靠这个原型。
另一方面,有一组函数声明在文件中的某一点引用是有用的,但即使是那些不使用自动索引源代码功能的IDE的人,也不是对我来说这是个大问题。
答案 3 :(得分:0)
我一般遵循“不要重复自己”的思想流派,并在翻译单元的顶部声明静态功能。当我更改功能签名时,我不喜欢有太多的编辑点。
减少功能可见的范围似乎是我的次要考虑因素 - 如果这一点特别重要(例如,如果我想确保人们不'滥用'功能)那么我会考虑移动它到另一个翻译单元以及调用代码。
答案 4 :(得分:0)
如果不为静态函数编写原型声明,则必须在使用它们之前定义它们。这是一个约束,据我自己的经验可以看出,这是一个很好的约束:它迫使开发人员按逻辑顺序编写代码,相关函数往往保持组合在一起。通过在文件顶部声明原型,代码更有可能变得混乱。
此外,非预先声明规则意味着当必须添加原型时(因为你有一个多级递归),那么原型往往会成为一个好的标记。困难的一段代码(即多级递归)。
答案 5 :(得分:0)
注意:此答案适用于C ++
在我看来,您认为使用原型被认为是良好的做法,而不是使用它们某种疏忽。我记得我的第一个C ++讲师也非常重视创建原型。
然而,在专业领域,我从未遇到过这样的规则。除了指南之外,您应该避免在头文件中编写函数/方法定义。但这主要是为了在接口和实现之间进行明确分离,并避免潜在的链接器错误。
回答你的问题:如果只在CPP文件中需要一个函数,那么它应是静态的或位于命名空间中以避免与外部冲突,并且它不需要有原型