据我的老师说,编写这样的用户定义函数是错误的做法:
int DoubleNumber(int Number)
{
    return Number * 2;
}
int main()
{
    cout << DoubleNumber(8);
}相反,他说,即使函数之间不需要任何知识,也要始终使用前向声明:
int DoubleNumber(int Number); // Forward declaration.
int main()
{
    cout << DoubleNumber(8);
}
int DoubleNumber(int Number) // Implementation.
{
    return Number * 2;
}我觉得这特别奇怪,因为他想告诉我们,前向声明和实现完全相同是多么重要,否则就会出现错误。如果这是件大事,为什么不把它放在main()上面呢?
那么,同时声明和实施真的很糟糕吗?这有关系吗?
发布于 2010-12-08 19:09:45
如果不声明前向声明(“原型”),则需要确保所有函数都发生在依赖它们的任何函数之前,即按调用图的相反顺序。对于上面这样一个简单的例子来说,这是很好的,但是对于任何更实际的事情(在某些情况下是不可能的,如果调用图中有任何循环的话),这是完全痛苦的。
发布于 2010-12-08 20:49:25
我认为你的老师是个老C程序员。
如果您编写了一个没有前向声明的C程序,并且有一个函数称为另一个函数(在文件后面(或在另一个编译单元中)),编译器将不会抱怨,而是默默地假装知道原型应该是什么。
调试是可怕的,如果您不知道编译器是否正确地传递参数。因此,始终声明所有函数是一种很好的防御策略;如果声明与实现不匹配,编译器至少会引发错误。
C编译器和工具已经变得更好了(我希望)。调用未知函数仍然不是一个错误,但例如GCC,在默认情况下发出警告是足够好的。
但是在C++中,您不能调用尚未声明或定义的函数。因此,C++程序员不太担心前向声明。
发布于 2010-12-08 19:10:47
你老师的政策很糟糕。只有在真正需要的时候才使用前向声明。这样,它们的存在就表明了它们的必要性,这给读者提供了有用的文档(例如,函数之间可能存在相互递归)。当然,您需要在头文件中进行前向声明;这就是它们的用途。
https://stackoverflow.com/questions/4391244
复制相似问题