C中main()的不同约定

Ali*_*Man 14 c program-entry-point

我唯一接触过编程的是Java,在那里我没有遇到(到现在为止)编写main方法的不同惯例.我一直在学习c(K&R和C编程现代方法)的来源,他们使用的非常不同形式的主要方法(功能).

K&R版本到现在为止:

main() {
    blah blah blah;
}
Run Code Online (Sandbox Code Playgroud)

C编程现代方法

int main() {
    blah blah blah;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

要么

int main() {
    blah blah blah; 
    //returns nothing
}
Run Code Online (Sandbox Code Playgroud)

为了让事情更加混乱,我见过人们这样做:

int main(void) {
    blah blah blah;
}
Run Code Online (Sandbox Code Playgroud)

虽然他们要么返回0,要么没有.我没有在我没有受过教育的假设中认为这只是一个标准问题,但可能更具概念性或更深层次.有人能解释一下这个问题吗?

小智 14

  • K&R风格已经过时,根据C标准不再正确.

  • 有效的签名是

    int main(void)
    
    Run Code Online (Sandbox Code Playgroud)

    int main(int argc, char *argv[])
    
    Run Code Online (Sandbox Code Playgroud)

    或者,等效,因为函数中的数组类型仍然调整为指针类型:

    int main(int argc, char **argv)
    
    Run Code Online (Sandbox Code Playgroud)
  • 签名

    int main()
    
    Run Code Online (Sandbox Code Playgroud)

    碰巧也是有效的,因为空参数列表意味着任何数量的参数,没有描述*).AFAIK,这可能会有变化,所以不要这样写.写作void是你如何表达这个函数不接受 C中的参数.

  • C的实现可以自由地提供其他实现定义的入口点.但我上面列出的两个是唯一由标准保证的.

  • main()如果函数没有返回任何内容,C99 为该状态引入了一个特殊规则,0隐式返回值.所以只有在主要内容中,您才可以跳过return.我的建议是:不要.这只是令人困惑.但这是一个意见.


*)注意这在C++中是不同的,其中parantheses之间没有任何东西确实意味着:没有参数.

  • *C99为`main()`引入了一个特殊规则,表明如果函数没有返回任何内容,则隐式返回值0.所以**只在主**中,你可以跳过`return`.我的建议是:不要.这只是令人困惑.但这是一个意见.*但这不仅仅是一个意见,因为仍然存在[编译器没有完全实现C99.](https://social.msdn.microsoft.com/Forums/vstudio/en-US/fa17bcdd -7165-4645-a676-ef3797b95918 /细节上-C99支持功能于MSVC?论坛= vcgeneral) (3认同)
  • @Andrew Henle微软并不是一个很好的例子,因为微软不再关心C了. (2认同)

dbu*_*ush 5

C的预标准化版本(称为K&R C)具有默认类型的概念(int如果没有给出).所以在K&R中:

main() {
Run Code Online (Sandbox Code Playgroud)

是相同的:

int main() {
Run Code Online (Sandbox Code Playgroud)

至于int main()和 之间的差异int main(void),空参数列表表示该函数采用未指定数量的参数,而(void)作为参数列表表示该函数不采用任何参数.前者是可以接受的,但后者是首选,因为它更明确.

关于return语句的使用,具有非void返回类型的函数必须用于return返回一个值,除了(从C99标准开始)该main函数.在这种情况下main,缺失return语句意味着返回值为0.

由于隐含return 0的主要是在C99加入,你会看到不取决于哪个版本的程序员符合标准做了一些代码,明确返回有的.


hac*_*cks 3

C 标准将签名定义main

int main(void)
Run Code Online (Sandbox Code Playgroud)

或者

int main(int argc, char *argv[])
Run Code Online (Sandbox Code Playgroud)

添加return 0;作为函数中的最后一个语句main是可选的。
标准还提到了一些实现定义的原型。int main()GCC编译器接受。

main()是一个老式的原型,几乎已被弃用。