在main()之后放置函数定义比在main()之前放置它们有什么优势吗?

时间:2017-12-27 05:24:33

标签: c function

在main之后放置函数与在main之前放置它们对程序有什么影响吗?

示例 - 之后:

    void foo(void);

    int main(void){
        …
    }

    void foo(void){
        …
    }

示例 - 之前:

    void foo(void){
        …
    }

    int main(void){
        …
    }

1 个答案:

答案 0 :(得分:5)

假设你使用的是旧的C(C99)或新的C(C11),而不是古代的C(C90)或者前者 - 稀释的C(标准前的C),那么在main()之前定义函数的好处是你不需要单独指定那些函数的原型 - 定义也指定了原型。

如果在包含main()的文件中定义的函数也在其他源文件中使用,那么您仍然会有一个标题声明这些函数,并且该标题将在包含{{1}的文件中使用和其他源文件。

如果可能的话,这些函数仅在包含main()的文件中使用,那么您可以确保将函数定义为main()

如果将函数定义放在static之后,则必须在使用之前声明函数(例如main())。这是因为不使用古代或前期的稀释C - 所有函数必须在使用前声明。

请注意,定义这样的函数 not 声明函数的原型:

main()

它提供了函数的声明,但它没有提供原型。这意味着你可以误拨它:

void somefunc()
{
    …operations…
}

并且编译器不需要抱怨滥用。 (C ++中的规则在这方面是不同的 - 所有函数定义都提供了一个原型.C有一个C ++没有的遗留代码库,这使得它不能成为C的合理规则 - 因此,C标准委员会是明智的人, C标准不包括不合理的规则。)

要将其变成原型,你必须写:

somefunc(1);
somefunc("a", "z");

因此,如果在void somefunc(void) { …operations… } 之前正确定义了函数,则无需重复声明。如果在main()之后定义函数,那么直接从main()调用的函数必须在定义main()之前在范围内具有声明(并且应该具有原型声明)。

请注意,您不应在其他函数中声明函数,无论它是多么允许。这种“隐藏”声明是一项主要的维护责任。声明应位于文件范围,通常位于文件顶部或标题中。

TL; DR

假设你用现代C写作:

  • 效果:无。
  • 优点:您可以从main()开始自上而下地学习代码。
  • 缺点:您必须声明函数并定义它们。