main()在C和C++中定义函数的正确(最有效)方法是什么- int main()或void main()- 为什么?如果int main()那么return 1或return 0?
这个问题有很多重复,包括:
main()函数的有效签名是什么?main()函数void main()和int main()?main()在C++中的签名main()? - 对于C++,确实有一个非常好的答案.main()C语言中的函数样式main()C中的方法类型int main()vs void main()在C中有关:
什么是更好的:void foo()或void foo(void)?随着虚空,它看起来丑陋和不一致,但我被告知它是好的.这是真的?
编辑:我知道一些旧的编译器做了奇怪的事情,但如果我只使用GCC,那void foo()好吗?将foo(bar);随后被接受?
C标准main为托管实现指定了两种形式的定义:
int main(void) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)
和
int main(int argc, char *argv[]) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)
它可以以与上述"等效"的方式定义(例如,您可以更改参数名称,替换int为定义为int或写char *argv[]为的typedef名称char **argv).
它也可以"以某种其他实现定义的方式"定义 - 这意味着如果实现记录它们,那么它们int main(int argc, char *argv[],
char *envp)是有效的.
"以其他一些实施方式定义的方式"条款不在1989/1990标准中; 它是由1999标准添加的(但早期标准允许扩展,因此实现仍然允许其他形式).
我的问题是:鉴于当前(2011)ISO C标准,是表格的定义
int main() { /* ... */ }
Run Code Online (Sandbox Code Playgroud)
所有托管实现都有效且可移植?
(请注意,我没有解决C++中的任何一个void main或没有使用
int main()括号的问题.这只是ISO int main(void)和int main()ISO 之间的区别.)
我正在为我的大学编写一个编译器/语言课程的玩具C编译器.
我试图在C中充实符号解析的语义,并提出了我尝试对常规编译器clang&gcc的测试用例.
void foo() { }
int main() { foo(5); } // foo has extraneous arguments
Run Code Online (Sandbox Code Playgroud)
大多数编译器似乎只是警告无关的论点.
问题:这背后的根本原因是什么?
对于我的符号表生成/解析阶段,我正在考虑一个函数是一个带有返回类型的符号,以及几个参数化的参数(基于语法),每个参数都有一个相应的类型.
谢谢.
练习是在输入中打印不同字符的直方图.在底部是我的代码,我将不同的字符分成3个类别a,b或其他,如果代码成功,则推断为更多类别的字符.但它没有我想要的输出,例如,ab cd我期望的输入
x
xxx
---
abo
t
h
e
r
Run Code Online (Sandbox Code Playgroud)
但我得到的只是
---
abo
t
h
e
r
Run Code Online (Sandbox Code Playgroud)
这是我的尝试:
#include<stdio.h>
main()
{
int i,c,b, max;
int array[3] = {0,0,0};
while( (c = getchar()) != EOF){
if(c== 'a')
++array[0];
else if(c== 'b')
++array[1];
else if(c=='\n' ||c=='\t' || c==' '){}
else ++array[2];
}
array[0]=max;
i=0;
while(i<3){
if(max>=array[i])
{}
else array[i]=max;
++i;
}
i=0;
max=b;
while(i<b){
if(array[0]>=max){
putchar('x');}
else putchar(' ');
if(array[1]>=max) {
putchar('x');}
else putchar(' ');
if (array[2]>=max){
putchar('x\n');}
else putchar(' …Run Code Online (Sandbox Code Playgroud) 这个问题可能有也可能没有,虽然我试图找到一个,但每个人的答案似乎只是指的是声明/原型.它们指定定义void foo() { }是相同的void foo(void) { },但我应该以哪种方式实际使用?在C89?在C99?我相信我应该开始使用void foo(void);我的原型声明,但如果我使用void或不使用定义,是否有任何区别?