在这样的代码:
int main(int a, int b)
{
printf(" main(int, int) works \n\n");
return 0;
}
的签名main
是main(int, int)
和它编译成功 。 为什么?
在这样的代码:
int main(int a, int b)
{
printf(" main(int, int) works \n\n");
return 0;
}
的签名main
是main(int, int)
和它编译成功 。 为什么?
因为C标准不禁止非标准签名main
(参见例如C99标准的部分5.1.2)。
然而,你会发现,如果你在使用GCC编译-Wall
标志,1它会抱怨:
test.c:4: warning: second argument of 'main' should be 'char **'
它假定要与一个标准的环境相互作用(即进程的命令行参数,并返回一个退出状态),在这种情况下,你必须使用int main(int, char **)
或int main(void)
。 如果你使用别的,自变量的内容将是不确定的。
C标准具体地提供一种原型禁止执行main
(C99,§5.1.2.2.1/ 1:“称为在程序启动时的函数称为main
,其实现声明没有原型实现此功能。”),和一个从原型不匹配就是将(通常)从停止编译的代码。
如果没有原型,你又回到了像旧时代的编程,当它是由你来确保你传递给函数的参数匹配预期的内容。 值得庆幸的是在的情况下, main
,签名是那么广为人知,它是很少的一个问题,但。
编辑:请注意,如果你要诚心的,它实际上甚至可以使用的版本有两个int
参数(尽管该技术在C ++中禁止的)。 main
可以递归调用自身,并且在这种情况下,可以/可以传递两个int
参数:
int main(int a, int b) {
if (a == 2)
main(2, 10);
printf("%d, %d", a, b);
return 0;
}
这是因为它坐落在漂亮没用,但给人的总体思路-你将会比不带命令行参数运行程序,在这种情况下, a
(这将接受你平常打电话argc
)通常为1
(即,它试图通过唯一的参数是argv中[0])的程序的名称。 在这种情况下,与其他一些值调用自身。 当这种情况发生,它打印出这些值。
为了公平起见,我要补充,这是非常接近纯理论的,肯定不推荐。 它会用最典型的实施工作,但该标准并不能保证它。 这是一个愚蠢的,迂回的方式来完成它做什么 - 但至少在最典型的编译器,它是(勉强)可能呢。
有没有指定的主签名的头文件,所以没有将报告错误。 编译器通常只检查返回值,主要的情况下(主要签名的警告是编译器相关的)。
int main(int a, int b)
这是毫无意义传递给主函数的参数总是
int main(int argc,char *argv[])
主要是一个不寻常的function.It由操作系统调用,如C ++可以在许多系统上运行,他们传递给OS上运行的程序是什么数据的C ++标准不能强行规定OS作家 - 你可以写你喜欢的任何参数主要功能和编译器会接受它。