首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >职能的宣布和履行

职能的宣布和履行
EN

Stack Overflow用户
提问于 2010-12-08 19:06:41
回答 9查看 17.6K关注 0票数 6

据我的老师说,编写这样的用户定义函数是错误的做法:

代码语言:javascript
运行
复制
int DoubleNumber(int Number)
{
    return Number * 2;
}

int main()
{
    cout << DoubleNumber(8);
}

相反,他说,即使函数之间不需要任何知识,也要始终使用前向声明:

代码语言:javascript
运行
复制
int DoubleNumber(int Number); // Forward declaration.

int main()
{
    cout << DoubleNumber(8);
}

int DoubleNumber(int Number) // Implementation.
{
    return Number * 2;
}

我觉得这特别奇怪,因为他想告诉我们,前向声明和实现完全相同是多么重要,否则就会出现错误。如果这是件大事,为什么不把它放在main()上面呢?

那么,同时声明和实施真的很糟糕吗?这有关系吗?

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2010-12-08 19:09:45

如果不声明前向声明(“原型”),则需要确保所有函数都发生在依赖它们的任何函数之前,即按调用图的相反顺序。对于上面这样一个简单的例子来说,这是很好的,但是对于任何更实际的事情(在某些情况下是不可能的,如果调用图中有任何循环的话),这是完全痛苦的。

票数 15
EN

Stack Overflow用户

发布于 2010-12-08 20:49:25

我认为你的老师是个老C程序员。

如果您编写了一个没有前向声明的C程序,并且有一个函数称为另一个函数(在文件后面(或在另一个编译单元中)),编译器将不会抱怨,而是默默地假装知道原型应该是什么。

调试是可怕的,如果您不知道编译器是否正确地传递参数。因此,始终声明所有函数是一种很好的防御策略;如果声明与实现不匹配,编译器至少会引发错误。

C编译器和工具已经变得更好了(我希望)。调用未知函数仍然不是一个错误,但例如GCC,在默认情况下发出警告是足够好的。

但是在C++中,您不能调用尚未声明或定义的函数。因此,C++程序员不太担心前向声明。

票数 9
EN

Stack Overflow用户

发布于 2010-12-08 19:10:47

你老师的政策很糟糕。只有在真正需要的时候才使用前向声明。这样,它们的存在就表明了它们的必要性,这给读者提供了有用的文档(例如,函数之间可能存在相互递归)。当然,您需要在头文件中进行前向声明;这就是它们的用途。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4391244

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档