我在学习C语言的时候,写了下面的代码:
#include <stdio.h> void main() { char ch='a'; printf("%c\n", ch); }
然后我用愚者编译代码,但我得到一个错误:
return type of 'main' is not 'int' [-Wmain-return-type]
我没有使用任何数据类型int,怎么了?
9jyewag01#
正如编译器告诉您的,main()必须返回int
main()
int
int main(void) { return 0; }
返回值是程序的退出代码。
pu82cl6c2#
在这种情况下,您需要使用
#include <...> int main(){ //code return 0; //or return any_integer; }
如果您的程序返回 nothing,系统将永远不会知道运行是否成功或是否存在一些错误。
evrscar23#
用途:
int main(void) { /* ... */ }
不带参数的main函数的定义。请注意,int main() { /* ... */ }也有效,但首选前一种定义。
main
int main() { /* ... */ }
nsc4cvqm4#
养成使用的习惯:
int main( int argc, char* argv[] ){ // your code return 0; }
argc是传递给程序的参数数。argv是字符串中的参数数组。
argc
argv
waxmsbnn5#
错误的意思是,main()应该返回int。使main()为int类型并返回一个有效的退出条件整数,通常终止是return 0。请参考前面的SO answer
return 0
gz5pxeao6#
好了,大家都在谈论在操作系统下运行C程序。这是完全正确的:
但是没有人会提到在实现C程序时当然会发生的其他不常见的情况:例如,未在任何操作系统下运行的C二进制文件、由于没有人接收或解释值而不从其主文件返回任何内容的C二进制文件、实际上 * 是 * 操作系统的C二进制文件或控制嵌入式系统的C二进制文件,在嵌入式系统中,其主要功能是在无限循环内同步其组件,等待请愿(根据定义永远不会回来)。前面的例子或多或少是等效的。在这些情况下,即使编译器抱怨,也可以像下面这样定义main:
void main() { ... }
你必须认真对待警告,但更重要的是了解你实际上在做什么。这是C:权力越大,责任越大。如果你在这种情况下,main的定义并不重要,因为没有人可以调用它,也没有人可以接收它的退出值。无论如何,在这些情况下,对主签名没有真实的的关注,并且如果将这些C程序定义为void main()或int main(int argc, char* argv[]),优化似乎不像是这些C程序的改进特征。所以,结论:
void main()
int main(int argc, char* argv[])
gcc
6条答案
按热度按时间9jyewag01#
正如编译器告诉您的,
main()
必须返回int
返回值是程序的退出代码。
pu82cl6c2#
在这种情况下,您需要使用
如果您的程序返回 nothing,系统将永远不会知道运行是否成功或是否存在一些错误。
evrscar23#
用途:
不带参数的
main
函数的定义。请注意,int main() { /* ... */ }
也有效,但首选前一种定义。nsc4cvqm4#
养成使用的习惯:
argc
是传递给程序的参数数。argv
是字符串中的参数数组。waxmsbnn5#
错误的意思是,
main()
应该返回int
。使main()
为int类型并返回一个有效的退出条件整数,通常终止是return 0
。请参考前面的SO answergz5pxeao6#
好了,大家都在谈论在操作系统下运行C程序。这是完全正确的:
int
。int
Map到程序的退出代码。但是没有人会提到在实现C程序时当然会发生的其他不常见的情况:例如,未在任何操作系统下运行的C二进制文件、由于没有人接收或解释值而不从其主文件返回任何内容的C二进制文件、实际上 * 是 * 操作系统的C二进制文件或控制嵌入式系统的C二进制文件,在嵌入式系统中,其主要功能是在无限循环内同步其组件,等待请愿(根据定义永远不会回来)。前面的例子或多或少是等效的。
在这些情况下,即使编译器抱怨,也可以像下面这样定义main:
你必须认真对待警告,但更重要的是了解你实际上在做什么。这是C:权力越大,责任越大。
如果你在这种情况下,main的定义并不重要,因为没有人可以调用它,也没有人可以接收它的退出值。
无论如何,在这些情况下,对主签名没有真实的的关注,并且如果将这些C程序定义为
void main()
或int main(int argc, char* argv[])
,优化似乎不像是这些C程序的改进特征。所以,结论:
int main(int argc, char* argv[])
的标准定义。针对这些情况考虑了gcc
的警告。