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

以下是什么意思:

int main(void) {...} 

VS

 int main() {...} 

我认为int main() {...}意味着main没有收到任何参数(从命令行),但是:

 int main(int argc, char *argv[]) 

确实。

但是int main(void) {...}是什么意思? 虚空是什么意思?

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

在C ++中,没有区别。


在C中,差别是有问题的。 有人喜欢争辩说后一种版本(没有void版本)在技术上只是一个普通的实现扩展,由于标准中的措词,不能保证按标准工作。 然而,标准清楚地表明,在一个函数定义中,一组空的参数具有一个定义良好的行为:该函数不带任何参数。 因此,这样的主要定义与标准中的以下描述相匹配:

它的[main]应该用一个inttypes的返回types来定义,而不带参数。

然而,两者之间有明显的区别:即没有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); } 

哦,而且要完整:在所有函数声明符中, void都具有以下含义:

(6.7.6.3p10)作为列表中唯一项目的voidtypes的未命名参数的特例指定该函数没有参数。

在C中,在一个原型中 (不是在C ++中),一个空的参数列表意味着该函数可以接受任何参数(在函数的定义中,它表示没有参数)。 在C ++中,一个空的参数列表意味着没有参数。 在C中,没有任何参数,你必须使用void 。 看到这个问题更好的解释。

在C ++中有一个函数foo(void)foo()是一样的。 然而,在C中它是不同的: foo(void)是一个没有参数的函数,而foo()是一个带有未指定参数的函数。

在C ++中,没有区别,两者是相同的。

这两个定义都是用C语言编写的,但是第二个使用void的定义在技术上更好,因为它清楚地指定了main只能被调用而没有任何参数。 在C中,如果一个函数签名没有指定任何参数,这意味着函数可以用任意数量的参数或没有任何参数来调用。 例如,尝试编译并运行以下两个C程序(记住将文件另存为.c)。

首先, 如图所示 ,托pipe系统和独立系统允许的区别是什么。

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

程序启动时调用的函数名为main。 这个实现声明了这个函数没有原型。 它应该用int的返回types来定义,并且不带参数:

 int main(void) 

…(有关argv / argc等样式的更多文字)

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

10types为void的未命名参数的特例是列表中唯一的项目,它指定该函数没有参数。

/ – /

14标识符列表仅声明该函数参数的标识符。 函数声明器中的空列表是该函数定义的一部分,指定该函数没有参数。 函数声明符中的空列表不是该函数定义的一部分,它指定不提供有关参数数量或types的信息.145)

强调我的,粗体文本是适用于int main() 。 文本末尾还有注释145),内容为“请参阅”“未来的语言指导”(6.11.6)“:

6.11.6函数声明符

具有空括号的函数声明符(不是原型格式参数types声明符)的使用是过时的function。

这是差别。 作为一个函数声明符, int main()由于上述原因是不好的样式 ,因为它不能保证在下一个C标准版本中工作。 它在C11中被标记为过时的特征。

因此,你应该总是在一个托pipe系统上使用int main (void) ,并且永远不要int main() ,即使这两个表单现在是等价的。


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

在C ++中,两者之间没有区别,而int main()int main()的合法签名和返回types。

具有Type foo(void)函数原型与Type foo(void)完全相同,两者之间没有区别。 前者可能用于可读性。

main参数一样,程序仍然可以通过其他方式访问命令行信息,如__argv__argcGetCommandLine或其他平台/编译器特定的符号。

我知道线程已经老了,但这个问题在几年前还困扰了我一阵子,所以我想把我的一半分钱(如果那样的话)。

除非使用va_args,否则我总是将C函数视为具有固定数量的参数。 也就是说,我相信主要总是有原型:

 int main(int argc, char **argv). 

即使没有parameter passing,函数在堆栈上有这些参数,因为主函数没有函数重载。

C通过假装参数不存在而具有原始重载的能力。 在这种情况下,参数仍然被传递并且在堆栈上,但是您永远不会访问它,所以它只会减less源代码的大小。

说int main()只是意味着我知道该函数可能有参数,但我没有使用它们,所以我写int main()。

说int main(void)表示主要一定没有参数,并且暗示有两个不同的函数原型:

 int main(void); int main(int argc, char **argv); 

由于C没有函数重载,这有点误导我,我不相信有主要(void)的代码。 我不会如果主要从未采取任何参数,在这种情况下主要(void)将是完全正确的。

注意:在一些实现中,main中的参数比argc和argv中的要多,比如env,但是这并不妨碍我,因为我知道我没有明确说这些参数是唯一的,但是这些参数是最小的参数可以有更多,但不能less。 这与对这个叫做无效参数的int main(void)的直言不讳,这是不正确的,因为它是这样做的,它们只是被省略了。

这是我的基础代码:

 /* sample.c - build into sample. */ #include <stdio.h> int main(void) { int _argc = *((int *)2686800); char ***_pargv = (char ***)2686804; int i; for (i = 1; i < _argc; ++i) { printf("%s ", (*_pargv)[i]); } return 0; } 

./sample我显然有论点

这个函数显然具有传递给它的参数,尽pipe不是明确地说,它不是通过在函数原型中inputvoid来实现的。

正如上面所说的:

(6.7.6.3p10)作为列表中唯一项目的voidtypes的未命名参数的特例指定该函数没有参数。

因此说这个函数作为一个论点是无效的,但实际上在这个堆栈上有争论是矛盾的。

我的观点是,论据仍然存在,所以明确地断言主要是没有论据是不诚实的。 诚实的方法是说int main(),它没有声明它有多less个参数,只有你有多less参数在意。

注2:_argc,_pargv是系统相关的,为了find你的值,你必须通过运行这个程序find它们:

 /* findargs.c */ #include <stdio.h> int main(int argc, char **argv) { printf("address of argc is %u.\n", &argc); printf("address of argv is %u.\n", &argv); return 0; } 

这些值应该适用于您的特定系统。

Interesting Posts