相关疑难解决方法(0)

在`main`可选的结尾处使`return 0`的理由是什么?

从C99标准开始,编译器需要生成等效的a return 0或者return EXIT_SUCCESS如果在结尾处没有提供返回main.在同一时间,对C++语言标准也进行了相应且相同的更改.我对两者的原因感兴趣,并且我猜测它们不太可能是完全独立且无关的变化.

我的问题是:

这种变化的记录理由是什么?

一个理想的答案将引用C和C++的权威来源,这就是我用两种语言标记问题的原因.

请注意,与问题不同,在ISO C++中,从main返回0的原因是什么?,我不是在询问是否写return 0我的程序的建议 - 我问的是为什么语言标准本身已经改变了.


为了帮助理解问题的目的,这里有更多的背景:

  1. 了解更改原因有助于决定如何使用它.
  2. 理由通常包含在标准本身中.例如,C90标准包括许多解释性脚注,例如脚注36,其开头是"此列表的意图......"

在我问到这个问题之前,我已经研究了自己寻找答案的标准,但没有找到答案.我被要求帮助为一组程序员编写两种语言的编码标准,我想确保我理解为什么这个功能存在,以便我可以准确地向其他人解释它的用途.

c c++ language-lawyer

32
推荐指数
2
解决办法
1469
查看次数

31
推荐指数
3
解决办法
6万
查看次数

如何退出C++控制台程序?

是否有一行代码将终止该程序?

像python的东西sys.exit()

c++ exit

29
推荐指数
3
解决办法
12万
查看次数

C中main(void)和main()之间的区别

谁能告诉我之间的差异int main()int main(void)?为什么它们都工作,默认参数是int main()什么?

c program-entry-point

27
推荐指数
2
解决办法
3万
查看次数

C++中main的签名参数是否具有unsigned和const限定符?

该标准明确规定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改变intunsigned int以及非顶层const的argv -ness?如果我是,那显然是禁止的.

那么,这些修改是否可以保证在符合标准的编译器上工作?

c++ program-entry-point signature

24
推荐指数
2
解决办法
1万
查看次数

C++中main()的法律定义14

关于main()[3.6.1] ,我能够找到的C++ 14的最后一个草案说:

实现不应预定义主函数.此功能不应过载.它应该具有int类型的返回类型,否则其类型是实现定义的.所有实现都应允许两者

- 返回int和的函数()

- 返回int的函数(int,指向char的指针)

及(第5段)

如果控制到达main的末尾而没有遇到return语句,则效果就是执行

return 0;

这是否意味着以下所有内容都是合法的C++ 14最小程序?如果没有,为什么不呢?

  1. auto main() -> int {}
  2. auto main() { return 0; }
  3. auto main() {}

c++ program-entry-point language-lawyer c++14

22
推荐指数
1
解决办法
1586
查看次数

int main()函数必须在所有编译器中返回一个值吗?

为什么在C++的某些编译器中使用int main()时不必包含return语句?Turbo C++怎么样?

c++ turbo-c++

20
推荐指数
3
解决办法
1万
查看次数

你能省略main函数中的返回类型吗?

关于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这种情况下功能是否特别?

c++

19
推荐指数
3
解决办法
1517
查看次数

C23 中 int main() 和 int main(void) 等价原型吗?

C23 在函数声明符中引入了新的语义:

\n
\n

6.7.6.3 函数声明符

\n

[...]

\n

13\xc2\xa0\xc2\xa0\xc2\xa0对于没有参数类型列表的函数声明符:效果就像是使用由关键字 组成的参数类型列表进行声明void。函数声明符提供函数的原型。

\n
\n

这似乎意味着具有空参数列表的函数定义可以等效地用()or编写(void)

\n

然而,该函数似乎并不能保证这种main等价性:

\n
\n

5.1.2.2.1 程序启动

\n

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

\n
int main(void) { /* ... */ }\n
Run Code Online (Sandbox Code Playgroud)\n

或带有两个参数(此处称为argcargv,但可以使用任何名称,因为它们对于声明它们的函数来说是本地的):

\n
int main(int argc, char *argv[]) { /* ... */ }\n
Run Code Online (Sandbox Code Playgroud)\n

或等效的或以某种其他实现定义的方式。

\n
\n

这似乎并不能保证 是 的int main() { /* ... */ }有效定义main,或者等效定义是否涵盖此变体?

\n
\n …

c language-lawyer function-prototypes c23

18
推荐指数
1
解决办法
2789
查看次数

char*argv []和char**argv之间的差异,为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中声明如何正确?

c arrays pointers parameter-passing argv

17
推荐指数
3
解决办法
4万
查看次数