【问题标题】:Prototyping a function - C++对函数进行原型设计 - C++
【发布时间】:2015-10-13 05:53:04
【问题描述】:

最近,我的一些 CPP 教程使用了函数原型。我知道你必须初始化函数,但它的整体用途是什么?难道你不能使用在 main() 之前编写整个函数而不是定义原型吗?

int returnValue(void);

int main()
{
  std::cout << returnValue() << std::endl;
  return 0;
}

int returnValue(void)
{
  return 10;
}

【问题讨论】:

  • 如果您有许多函数相互调用,您将有一项有趣的任务,即按照被调用者总是在调用者之前定义的精确顺序排列它们。当然,您可以有两个或多个函数以递归方式相互调用。此外,一旦程序变得足够大,您通常不会将整个程序编写在单个源文件中。然后你可以把原型放到头文件中,把实现放到几个源文件中。
  • @IgorTandetnik,你应该发表你的评论作为答案
  • 啊,现在合乎逻辑了。现在就快速/短程序而言,它们真的不重要了吗?
  • @EnthusedBinary 是的,对于您的示例,这根本不重要。
  • 它们很重要。良好的代码组织从一开始就很重要

标签: c++ function function-prototypes


【解决方案1】:

难道你不能在 main() 之前编写整个函数而不是定义一个原型吗?

我能想到以下你不能想到的情况。

多个文件中使用的函数

如果一个函数在多个源文件 (.cpp) 中使用,您只能在一个源文件中定义该函数。您必须在剩余的源文件中声明它。为了方便和避免错误,这些声明放在头文件中。头文件然后由源文件#included。

相互递归函数

如果foo 调用barbar 调用foo,则必须提供至少一个函数的声明才能实现它们。

作为一种良好做法,最好先声明这两个函数。然后你可以按任意顺序实现它们。

【讨论】:

    【解决方案2】:

    一个重要的用例是将实现与声明分开。换句话说,您在头文件中声明您的函数/类等,并在 cpp 文件中定义(即实现)它们。通过这种方式,您可以分发具有完全编译在共享或静态库中的实现的程序。为了使用预编译的函数,您需要通过声明将其引入您的程序。示例:

    啊.h

    void f();
    

    a.cpp

    void f(){/* implementation here */}
    

    ma​​in.cpp

    #include "a.h"
    
    int main()
    {
        f();
    }
    

    main() 中包含"a.h" 是声明函数。一旦你编译了a.cpp,你就不再需要它的源代码了,只要你至少可以访问目标文件,程序就会运行,但是为了让链接器找到函数f(),你需要声明它。

    【讨论】:

    • 谢谢。我现在了解并将开始使用更清晰的执行和更大的组织
    【解决方案3】:

    如果未指定函数原型,则行为特定于编译器实现的 C 标准(C90 或 C99)。直到 C90 标准,C 编译器将省略的函数原型的返回类型假定为 int。而编译器端的这种假设可能会导致未指定的程序行为。

    后来的 C99 标准规定编译器不能再假定返回类型为 int。因此,C99 对函数原型的类型检查变得更加严格。但是为了使 C99 标准向后兼容,实际上,编译器会抛出警告说返回类型假定为 int。但他们继续编译。因此,程序员有责任确保假定的函数原型和实际的函数类型匹配。

    为了避免所有这些 C 标准的实现细节,最好有函数原型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-14
      • 2011-03-06
      • 1970-01-01
      • 2012-05-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多