Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1646731
  • 博文数量: 311
  • 博客积分: 7778
  • 博客等级: 少将
  • 技术积分: 4186
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-09 19:59
个人简介

蓝点工坊(http://www.bluedrum.cn) 创始人,App和嵌入式产品开发。同时也做相应培训和外包工作。 详细介绍 http://pan.baidu.com/s/1y2g88

文章存档

2012年(3)

2011年(115)

2010年(170)

2009年(23)

分类: C/C++

2010-01-26 21:18:06

在标准C中有几条是编译通不过的.
1.C++注释 ,//
2.不能在执行语句后面定义变量.
3.for循环初始化时定义变量 for(int i=0 ; i < 100 ; i++)
4.变长数组.
 
一般编译加 -ansi 选项,即可完成按标准C( C89语法)来进行编译.
以下代码在VC++ 6.0是编译通不过的.
 

/* Author : Andrew Huang <> */

#include <stdio.h>

int main()
{
  int a ,b ;

  b = getchar();
 
  char ary[b]; /*1 */

  printf("%c\n",b);
  printf("%d\n",sizeof(ary));

  for(int i=0 ; i <10 ; i++) /*2*/
  {
     printf("%d\n",i);
  }

 return 0;
}

这个代码1处有两个问题,在执行语句后面定义变量,然后使用变长数组.2处使用循环变量内部定义变量.

但很可惜在RHEL 下,用gcc 编译这个代码
gcc version 4.1.1 20070105 (Red Hat 4.1.1-52)

gcc test.c -o test -std=c99 可以直接编译上述程序,这个不奇怪.

gcc test.c -o test -ansi 可以编译除了for内定义代码.

但是 gcc test.c -o test -std=c89 居然也难编译除了for内定义代码.这就有点过份了,c89好象从没有支持变长数组和变量吗?

在RHEL 5下使用gcc 4.1.1 编译如下语句

/* Author : Andrew Huang <> */
/*
 gcc test.c -o test -ansi
*/

#include <stdio.h>

int main()
{
  int a ,b ;

  b = getchar();
 
  char ary[b];
/*1 */

  printf("%c\n",b);
  printf("sizeof(ary)=%d\n",sizeof(ary));

 return 0;
}



用gcc test.c -o test -ansi 编译后,运行测试.

[root@rhel5 test]# gcc test.c -o test -ansi
[root@rhel5 test]# ./test
A
b=A
sizeof(ary)=65
[root@rhel5 test]# ./test
B
b=B
sizeof(ary)=66

结论,这种扩展还不要为好,大家都是把ansi 当成C89.但是把C99的东西强行当成C89,这种程序实际上移植有很大问题,在嵌入式领域优为如此.

文件: test.zip
大小: 0KB
下载: 下载



阅读(940) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~