记录C/C++的几个标准以及main()函数的使用

来源:互联网 发布:javascript官网 编辑:程序博客网 时间:2024/06/06 16:50

估计是跟着谭浩强学的C语言导致的,现在Gcc编译各种不通过让我很郁闷,不得已又得拿起书来重新学一遍,真正发现C语言没有那么简单。当初学的时候被坑了而已。

for(int i = 0;i<size;i++)

这段以前VC++上写的最顺手的程序,在Gcc编译下直接报错:

$ gcc array.c array.c: In function ‘print_Array’: array.c:9:5: error:
‘for’ loop initial declarations are only allowed in C99 mode
for(int i = 0;i < size;i++)
^ array.c:9:5: note: use option -std=c99 or -std=gnu99 to compile your code

原因很简单,ANSI C标准是根本就不支持这种写法的,标准C语言的写法是

int i;for(i = 0;i<size;i++)

C++的标准兼容了C,所以使用C++编译器编译不会报错,能拿着C++的编译器来教C的也没谁了……
想要不更改编译上面那句程序,根据提示在后面加上 -std=c99即可。

还有一个问题,main()函数的问题。
标准C的main()函数写法:

main(){    printf("hello world\n");}

这是C之父在所作的《C程序设计语言 第2版》的书上第一个程序。这是因为第一版的C语言只有int类型,直接可以省略不写。ANSI C标准中这完全是正确的,默认会return 0。

但是在后来的C99标准中,不允许这么写了,起码会报一个未定义返回值类型的警告。
C99标准中定义的main()函数写法只有两个:

int main( void ) int main( int argc, char *argv[] ) 

第一种不需要从命令行中获取参数,否则,要使用第二种写法。
参数argc记录了命令行中命令与参数的个数,而指针数组*argv[]的大小由参数argc的值决定,数组的各指针分别指向一个字符串。应当引起注意的是接收到的指针数组的各指针是从命令行的开始接收的,首先接收到的是命令,其后才是参数。
C++98 中定义了如下两种 main 函数的定义方式:

int main( ) int main( int argc, char *argv[] )

第一个标准就相当于C99中的int main(void),在Gcc编译器下,不加return 0也是可以通过的。但是为了更好的移植性,和适应新标准,我们的程序应该写成如下:

#include <stdio.h>int main(){  return 0;}

至于void main()这种写法,既不是C也不是C++定义的标准,根本就是错误的,main()函数的要求返回值必须是int类型。只是在某些编译器上,编译可以通过,例如vc6。
那么为什么一定要return 0呢?
答案是return 0是表示程序正常编译退出所返回的值,如果我们返回别的值,程序会认为异常退出。

举例子:a和b两个程序,a&&b表示执行完a正常执行完之后执行b,但是如果a的返回值不是0,那么我们就只能看到a被执行,b不会被执行。

总所周知,main()函数是主函数,程序执行的起点,当然main是相对来说的。其实main()函数未必是真正的入口点。
我引用C的一位大神告诉我的话:

默认情况下真正的程序入口点是运行时库的一个函数 它会执行运行时库的初始化 处理命令行 编译器会根据你的main形式决定如何调用你的main,所以多个形式的main只是运行时库联合编译器提供的支持。

C的几个标准有:

  • C89标准,ANSI制定的第一个C语言标准,在1989年被正式采用,故称C89,也称ANSI C,是ISO国际标准。
  • C99标准,由ISO制定于1999年(ISO/IEC 9899:1999),故称为C99。
  • C11标准,由ISO制定于2011年(ISO/IEC 9899:2011),故称为C11。

我们今天用的C语言标准,基本大多都是ANSI C,也就是C89,这就是为什么不满足这个标准的写法容易出问题的原因。
写C还是尽量按照ANSI C的标准来写,在Gcc编译,写C++再按照着C++的标准来写,这样也不至于混乱了。