LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1605|回复: 12

C语言特性的一些补充

[复制链接]
发表于 2007-6-5 20:58:39 | 显示全部楼层 |阅读模式
最近看到一些对C语言的不常见的用法, 特与大家分享
若高手觉得太简单, 莫见笑.

1.声明变长数组
在VC中,对于数组的声明,只能是常量,而不能够是变量.而在gcc中如下代码却是可以成功运行的

  1. #include<stdio.h>

  2. int main()
  3. {
  4.         int i, j;
  5.         scanf("%d%d", &i, &j);
  6.         int a[i][j];
  7.         printf("%d\n", sizeof(a));
  8.         return 0;
  9. }
复制代码

在这里, 可以在运行的时候再决定这个数组的大小为多少, 就避免了使用malloc在堆中分配这种方法.

2.为数组赋值
如果声明了一个100000长度的整形数组,需要将这个数组的最后一位赋为10,而其余位全部赋为0,如果在VC中,则需要使用循环的方式将前99999赋为0,然后再将最后一位赋为10,而使用gcc则可以很好地解决这个问题. 如下:


  1. #include<stdio.h>

  2. int main()
  3. {
  4.         int i;
  5.         int array[100000] = {[99999] = 10};
  6.         for (i = 0; i < 100000; i++)
  7.                 printf("%d  \n", array[i]);
  8.         return 0;
  9. }

复制代码

此时,除了最后一位为10,其余位全为0.

3.在C程序中在main()函数之前运行的函数
通过gcc的函数的属性,可以设置某些函数在main()函数之前运行.如:

  1. #include<stdio.h>


  2. void first() __attribute__((constructor));
  3. void first()
  4. {
  5.         printf("This is function %s\n", __FUNCTION__);
  6.         main();
  7.         return ;
  8. }

  9. int main()
  10. {
  11.         printf("This is function %s\n", __FUNCTION__);
  12.         return 0;
  13. }

复制代码


通过设置函数属性为constuctor, 可使其在main()之前运行.
发表于 2007-6-5 21:04:26 | 显示全部楼层
VC 不是 C 的标准,它甚至不是标准的 C,拿它作为对比,在开源社区中并不太合适。楼主不如作一下 c89 和 c99 的对比,会比这个有趣的多
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-6-5 21:11:15 | 显示全部楼层
C89与C99区别甚多, 也只有平时不断积累,一下子要说完还真得费很大的功夫,所以积少成多吧.

我上面所提出来的1, 2两个特性就是C99中新增加的, 对于C89是没有这个特性的. 而第3个特性则是gcc编译器的一个性质而已.
回复 支持 反对

使用道具 举报

发表于 2007-6-7 01:49:50 | 显示全部楼层
Post by scutan
C89与C99区别甚多, 也只有平时不断积累,一下子要说完还真得费很大的功夫,所以积少成多吧.

我上面所提出来的1, 2两个特性就是C99中新增加的, 对于C89是没有这个特性的. 而第3个特性则是gcc编译器的一个性质而已.

C99中的好些新的特性都来自于GCC对C的扩充。上面两个都是,还有可变参数宏,结构体成员赋值,虽然语法不一定完全一致。
回复 支持 反对

使用道具 举报

发表于 2007-6-14 09:22:38 | 显示全部楼层
gcc-4.3 将会使用c99规则的inline,届时很有可能 gcc 默认的编译选项将会默认使用 -std=gnu99 了。学习 c99 势在必行了。
回复 支持 反对

使用道具 举报

发表于 2007-6-14 09:54:33 | 显示全部楼层
Post by manphiz
gcc-4.3 将会使用c99规则的inline,届时很有可能 gcc 默认的编译选项将会默认使用 -std=gnu99 了。学习 c99 势在必行了。

这个关键看你是否关注程序的可移植性了。比较现在支持C99的编译器并不多,当然你也可以说GCC已经在很多平台上可用了。
回复 支持 反对

使用道具 举报

发表于 2007-6-14 12:02:55 | 显示全部楼层
Post by pupilzeng
这个关键看你是否关注程序的可移植性了。比较现在支持C99的编译器并不多,当然你也可以说GCC已经在很多平台上可用了。

嗯,新标准的确立本应意味着旧标准的淘汰,却被实际应用支持所束缚。 c99 出来8年了,目前却只有 EDG 全面支持,的确有些尴尬。不过至少大家还是在向这个方面发展,也应当肯定 c99 的作用。
回复 支持 反对

使用道具 举报

自由狼-台风 该用户已被删除
发表于 2007-6-19 00:45:46 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

发表于 2007-6-19 10:34:45 | 显示全部楼层
Post by manphiz
嗯,新标准的确立本应意味着旧标准的淘汰,却被实际应用支持所束缚。 c99 出来8年了,目前却只有 EDG 全面支持,的确有些尴尬。不过至少大家还是在向这个方面发展,也应当肯定 c99 的作用。
那 C++ 标准岂不更尴尬,都出来 9 年了,全面支持的编译器甚至还没有。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-6-19 12:50:01 | 显示全部楼层
Post by herberteuler
那 C++ 标准岂不更尴尬,都出来 9 年了,全面支持的编译器甚至还没有。


我感觉是学术是学术,而真正用到商业上又是另外一套.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表