职能的宣言和实施

Max*_*xpm 7 c++ implementation user-defined-functions

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

int DoubleNumber(int Number)
{
    return Number * 2;
}

int main()
{
    cout << DoubleNumber(8);
}
Run Code Online (Sandbox Code Playgroud)

相反,他说总是使用前向声明,即使这些函数不需要彼此了解:

int DoubleNumber(int Number); // Forward declaration.

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

int DoubleNumber(int Number) // Implementation.
{
    return Number * 2;
}
Run Code Online (Sandbox Code Playgroud)

我发现这个特别奇怪,因为他告诉我们前向声明和实现完全相同或者你会得到错误是多么重要.如果这是一个大问题,为什么不把它全部放在上面main()呢?

那么,同时申报和实施真的是不好的做法吗?它甚至重要吗?

Oli*_*rth 14

如果您没有声明前向声明("prototypes"),那么您需要确保所有函数在依赖于它们的任何函数之前发生,即以调用图的相反顺序.这对于上面的一个简单示例来说很好,但对于任何更现实的事情来说都是完全痛苦的(如果调用图中有任何循环,在某些情况下是不可能的).

  • 我发现重新排序函数比保持声明和定义同步更简单.它还有助于说明设计的层次结构 - 顶部的助手,然后是更重要的东西,然后是底部的main().但是,似乎有些人更喜欢完全相反的顺序. (7认同)

ant*_*kos 7

我认为你的老师是一位老C程序员.

如果你编写了一个没有前向声明的C程序,而另一个函数调用了稍后在文件中(或者在不同的编译单元中)声明的另一个函数,编译器就不会抱怨,而是默默地假装知道原型应该是什么.

如果你不知道你的编译器是否正确地传递了参数,那么调试是可怕的.因此,始终宣布所有职能是一个很好的防御政策; 如果声明与实现不匹配,至少编译器可能会引发错误.

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

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

  • +1用于解释C语言的基本原理. (3认同)

Kar*_*tel 6

你的老师的政策是可怕的恕我直言.只有在真正需要时才使用前向声明.这样,他们的存在证明了他们的必要性,这为读者提供了有用的文档(即,函数之间可能存在相互递归).当然,你需要在头文件中进行前向声明; 这就是他们的目的.

  • 唯一可怕的是没有解释原因.休息是关于惯例.根据我的经验,争夺"可怕"惯例通常比遵守更多浪费时间. (2认同)