【问题标题】:What's the difference between declaring functions before or after main()?在 main() 之前或之后声明函数有什么区别?
【发布时间】:2014-02-12 04:02:47
【问题描述】:

两者有什么区别:

void function();

int main()
{......}

void function()
{......}

对

void function()
{.......}

int main();

在 main 之前声明一个函数然后在 main 之后定义它似乎很奇怪,而您可以在 main 之前声明和定义它。是出于审美目的吗?我的老师像第一个例子一样编写函数。

【问题讨论】:

  • 我认为这仅适用于小样本应用程序。在实际应用中这不是什么大问题。

标签: c++


【解决方案1】:

这只是为了代码组织的目的(我猜是“美学”)。如果没有前向声明,您需要在使用每个函数之前编写它,但出于组织目的,您可能希望以不同的顺序编写函数的主体。

使用前向声明还允许您在最顶部的文件中提供定义的函数列表,而无需深入研究实现。

在相互递归函数的情况下,前向声明也是必要的。考虑这个(愚蠢的)例子:

bool is_odd(int);  // neccesary

bool is_even(int x) {
  if (x == 0) {
    return true;
  } else {
    return is_odd(x - 1);
  }
}

bool is_odd(int x) {
  return is_even(x - 1);
}

【讨论】:

  • 除了编写递归函数之外,是否有必要对函数进行声明/原型设计?
  • 另一种相当“必要”的情况是,当您分发包含在单独的编译目标文件或动态库中定义的函数原型的头文件时。
【解决方案2】:

注意我的意思是补充这个答案,其他人已经对这个问题给出了很好的答案。

请注意,了解如何在 C++ 中前向声明事物变得非常重要。一旦你开始使用头文件,它基本上就变成了强制性的。头文件将允许您构建函数和类/结构的原型,然后在相应的 .cpp 文件中定义它们。这是 C++ 的一个非常重要的组织特征。

// MyClass.h

class MyClass
{
public:
    MyClass(int x);
    void printInt();
private:
    int myInt;
};

// MyClass.cpp

MyClass::MyClass(int x)
{
    MyClass::myInt = x;
}

void MyClass::printInt()
{
    std::cout << MyClass::myInt;
}

以这种方式做事使您不必完全编写大杂烩的代码。特别是如果您正在编写具有大量源代码的真实程序。

因此,虽然在您提出的问题中,前向声明实际上只是更多的偏好,但稍后它真的不会是一种选择。

【讨论】:

  • 我认为这在某种意义上也是 C 语言中的“真实”答案。您将函数声明放在头文件中,并将它们(作为前向声明)包含在使用这些函数的 C 代码文件中。它远不止美观——创建可维护的模块化代码是强制性的。
【解决方案3】:

看这个例子:

int max(int num1, int num2) 
{
   // local variable declaration
   int result;

   if (num1 > num2)
      result = num1;
   else
      result = num2;

   return result; 
}

其中,int max(int num1, int num2) 表现为函数。

现在,我们有一个程序

#include <iostream>
using namespace std;

// function declaration
int max(int num1, int num2);

int main ()
{
   // local variable declaration:
   int a = 100;
   int b = 200;
   int ret;

   // calling a function to get max value.
   ret = max(a, b);

   cout << "Max value is : " << ret << endl;

   return 0;
}

// function returning the max between two numbers
int max(int num1, int num2) 
{
   // local variable declaration
   int result;

   if (num1 > num2)
      result = num1;
   else
      result = num2;

   return result; 
}

我保留了max() 函数和main() 函数并编译了源代码。在运行最终的可执行文件时,它会产生以下结果:

Max value is : 200

调用函数:

在创建 C++ 函数时,您定义了该函数必须做什么。要使用函数,您必须调用或调用该函数。

当程序调用函数时,程序控制权转移到被调用函数。被调用的函数执行定义的任务,当它的返回语句被执行或到达它的函数结束右括号时,它将程序控制权返回给主程序。

要调用函数,只需要传递所需的参数和函数名,如果函数返回值,则可以存储返回值。

【讨论】:

  • 我想他只是想知道在 main() 之前或之后放置函数之间的区别,但对努力表示敬意。
  • 所以我用扎实的例子简单地解释了他/他,你为什么有任何疑问?
【解决方案4】:

你的第一个例子是自上而下的风格,第二个是自下而上的风格。

这主要是为了审美,因为有些人更喜欢其中一个。

例如,有些人可能更喜欢先了解程序的高级概述,然后再了解详细信息(自上而下),而另一个人可能更喜欢先查看详细信息(自下而上)。

自顶向下方法中声明的一个切实好处是,您可以更轻松地重新组织函数定义,而不必担心排序问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-04
    • 2014-02-17
    • 2013-01-22
    • 2019-09-22
    • 1970-01-01
    • 2011-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多