从C99标准开始,编译器需要生成等效的a return 0或者return EXIT_SUCCESS如果在结尾处没有提供返回main.在同一时间,对C++语言标准也进行了相应且相同的更改.我对两者的原因感兴趣,并且我猜测它们不太可能是完全独立且无关的变化.
我的问题是:
这种变化的记录理由是什么?
一个理想的答案将引用C和C++的权威来源,这就是我用两种语言标记问题的原因.
请注意,与问题不同,在ISO C++中,从main返回0的原因是什么?,我不是在询问是否写return 0我的程序的建议 - 我问的是为什么语言标准本身已经改变了.
为了帮助理解问题的目的,这里有更多的背景:
在我问到这个问题之前,我已经研究了自己寻找答案的标准,但没有找到答案.我被要求帮助为一组程序员编写两种语言的编码标准,我想确保我理解为什么这个功能存在,以便我可以准确地向其他人解释它的用途.
为什么我们需要使用int main而不是void main在C++中?
谁能告诉我之间的差异int main()和int main(void)?为什么它们都工作,默认参数是int main()什么?
该标准明确规定main有两个有效(即保证有效)的签名; 即:
int main();
int main(int, char*[]);
Run Code Online (Sandbox Code Playgroud)
我的问题很简单,以下是合法的吗?
int main(const unsigned int, const char* const* argv);
Run Code Online (Sandbox Code Playgroud)
我的测试中说"是",但我不能确定的答案,因为我不能超载main改变int来unsigned int以及非顶层const的argv -ness?如果我是,那显然是禁止的.
那么,这些修改是否可以保证在符合标准的编译器上工作?
关于main()[3.6.1] ,我能够找到的C++ 14的最后一个草案说:
实现不应预定义主函数.此功能不应过载.它应该具有int类型的返回类型,否则其类型是实现定义的.所有实现都应允许两者
- 返回int和的函数()
- 返回int的函数(int,指向char的指针)
及(第5段)
如果控制到达main的末尾而没有遇到return语句,则效果就是执行
return 0;
这是否意味着以下所有内容都是合法的C++ 14最小程序?如果没有,为什么不呢?
auto main() -> int {}auto main() { return 0; }auto main() {}为什么在C++的某些编译器中使用int main()时不必包含return语句?Turbo C++怎么样?
关于main功能的声明是否有一些特殊规则?
根据ideone,这是合法的C++:
main() // As opposed to int main()
{
return 0;
}
Run Code Online (Sandbox Code Playgroud)
另一方面,正常函数似乎没有权限避免返回类型:
f(){}
int main()
{
return 0;
}
Run Code Online (Sandbox Code Playgroud)
给出错误:
prog.cpp:1:3:错误:ISO C++禁止声明'f'没有类型[-fpermissive] f(){} ^
main这种情况下功能是否特别?
C23 在函数声明符中引入了新的语义:
\n\n\n6.7.6.3 函数声明符
\n[...]
\n13\xc2\xa0\xc2\xa0\xc2\xa0对于没有参数类型列表的函数声明符:效果就像是使用由关键字 组成的参数类型列表进行声明
\nvoid。函数声明符提供函数的原型。
这似乎意味着具有空参数列表的函数定义可以等效地用()or编写(void)。
然而,该函数似乎并不能保证这种main等价性:
\n\n5.1.2.2.1 程序启动
\n程序启动时调用的函数名为
\nmain。该实现没有声明该函数的原型。它的返回类型应为int且不带参数定义:Run Code Online (Sandbox Code Playgroud)\nint main(void) { /* ... */ }\n或带有两个参数(此处称为
\nargc和argv,但可以使用任何名称,因为它们对于声明它们的函数来说是本地的):Run Code Online (Sandbox Code Playgroud)\nint main(int argc, char *argv[]) { /* ... */ }\n或等效的或以某种其他实现定义的方式。
\n
这似乎并不能保证 是 的int main() { /* ... */ }有效定义main,或者等效定义是否涵盖此变体?
代码1
#include<stdio.h>
int main(int argc, char *argv[])
{
int j;
printf("%d", argv[1][0]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
代码2
#include<stdio.h>
int main(int argc, char **argv)
{
int j;
printf("%d", argv[1][0]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
CODE 1和CODE 2都提供相同的输出.但是CODE 1和CODE 2中主要功能的参数2是不同的.在编译时在数据部分上创建指针数组.argv是指针数组.然后我们应该在main函数中声明参数作为指向字符的指针,即**argv.在CODE 1中声明如何正确?