int main()和int main(void)之间的区别?

JAN*_*JAN 55 c program-entry-point void

以下是什么意思:

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

VS

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

我认为这int main() {...}意味着main不接收任何参数(来自命令行),但是:

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

确实.

但这int main(void) {...} 意味着什么?什么是无效主张?

我看过这里,但这是一个不同的问题.

eq-*_*eq- 50

在C++中,没有区别.


在C中,差异是值得怀疑的.有些人喜欢争论后一版本(没有版本void)在技术上只是一个常见的实现扩展,并且由于标准中的措辞而无法保证按标准工作.但是,该标准明确指出,在函数定义中,一组空参数具有明确定义的行为:该函数不接受任何参数.因此,main的这种定义与标准中的以下描述相符:

它[main]应该用返回类型int定义,没有参数.

但是,两者之间存在明显的差异:即版本void无法为函数提供正确的原型:

// this is OK.
int main()
{
  if (0) main(42);
}

// this requires a diagnostic to be shown during compiling
int main(void)
{
  if (0) main(42);
}
Run Code Online (Sandbox Code Playgroud)

哦,只是为了完成:它void在所有函数声明符中具有以下含义:

(6.7.6.3p10)void类型的未命名参数作为列表中唯一项的特殊情况指定该函数没有参数.

  • 是的,但是它做了什么?这是我第一次在main()中看到main()的调用. (7认同)
  • 在你的第一个例子中,`main(42);`是什么意思(你在哪里写'//这没关系')? (2认同)
  • +1清除那个神话.我只是不同意它不是原型的部分.术语"原型"不是通过语法定义的,而是通过语义定义的,in是函数的声明,它也声明了其参数的类型.`int main(){...}`非常适合那里.并非所有编译器都同意这一点,但这是一个不同的观点:) (2认同)
  • @JensGustedt毫无疑问,但是结论不是您所期望的。`int main()`不提供原型。这一直是讨论的共同点,但是委员会在[DR#317](http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_317.htm)中提供了明确的答案: “语法指出,空括号代表空标识符列表,而不是空参数类型列表。” (2认同)

Lin*_*ios 5

在C中,在原型中(不是在C++中),空参数列表意味着该函数可以接受任何参数(在函数的定义中,它表示没有参数).在C++中,空参数列表表示没有参数.在C中,为了得到没有参数,你必须使用void.请参阅问题以获得更好的解释.


Lun*_*din 5

首先,托管系统和独立系统所允许的内容有所不同,如下所示

对于托管系统,5.1.2.2.1 程序启动适用:

程序启动时调用的函数名为 main。实现声明没有此函数的原型。它应定义为返回类型为 int 且不带参数:

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

...(有关 argv/argc 等样式的更多文本如下)。

有趣的部分是“没有参数”。int main()int main (void)目前是等价的,因为它们都是函数声明符并且没有参数。以下适用(6.7.6.3):

10 void 类型的未命名参数作为列表中唯一项的特殊情况指定该函数没有参数。

/--/

14 标识符列表仅声明函数参数的标识符。作为该函数定义的一部分的函数声明符中的空列表指定该函数没有参数。不属于该函数定义的函数声明符中的空列表指定不提供有关参数数量或类型的信息。145)

强调我的,粗体文本适用于int main(). 文末还有注释 145),上面写着“请参阅‘未来语言方向’(6.11.6)”:

6.11.6 函数声明符

使用带空括号的函数声明符(不是原型格式参数类型声明符)是一个过时的特性。

这就是不同之处。由于上述原因,作为函数声明符int main()是一种糟糕的风格,因为它不能保证在 C 标准的下一版本中工作。它在 C11 中被标记为过时的功能。

因此,您应该始终int main (void)在托管系统上使用,而永远不要使用int main(),即使这两种形式目前是等效的。


在 C++ 中,这两种形式是完全等价的,但是int main()出于主观的、美观的原因,有一种首选风格(Bjarne Stroustrup 是这样说的……这可能是解释为什么以特定方式做某事的理由很糟糕)。