ivaneeo's blog

自由的力量,自由的生活。

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  669 Posts :: 0 Stories :: 64 Comments :: 0 Trackbacks
1.关于可移植性
#ifdef __STRICT_ANSI__
/* use ANSI/ISO C only here */
#else
/* use GNU extensions here */
#endif
如果用户或是ANSI兼容的编译器定义了__STRICT_ANSI__宏,则表明需施加ANSI兼容的环境,并编译#ifdef语句块的第一部分代码.否则,编译#else后面的代码.
2.GNU扩展
  gcc使用long long 类型来提供64位储存单元:
  long long long_int_var;
内联函数
  要使用内联函数,需在函数的返回类型前面插入关键字inline,如下面的代码片段所示,还要在编译时使用-O优化选项.
  inline void swap(int *a, int *b)
  {
    int tmp = *a;
    *a = *b;
    *b = tmp;
  }
函数和变量属性
  关键字attribute通过向gcc指明有关代码的更多信息来帮助代码优化工作进行得更好.例如,标准库函数exit和 abort都不返回调用它们的函数.编译器如果知道它们不返回就能生成效率稍高的代码.当然用户程序也能定义不返回的函数.gcc允许为这些函数指定 noreturn属性,作为编译器在优化该函数时的提示.
  
例如,假设有个没有返回的函数die_on_error.为了使用函数属性,可以在函数声明后面加上__attribute__((attribute_name)).于是函数die_on_error的声明如下:
  void die_on_error(void) __attribute__ ((noreturn));
函数还和平常一样来定义:
  #include <stdlib.h>
  void die_on_error(void)
  {
    /* your code here */
    exit(EXIT_FAILURE);
  }

也可以对变量指定属性.例如,aligned属性指示编译器在为变量分配内存空间时按指定字节数对齐边界.下列语句:
  int int_var __attribute__ ((aligned 16)) = 0;
使gcc让变量int_var的边界按16字节对齐.packed属性告诉gcc为变量或结构分配最小的内存空间.

如果想要关闭对未用变量发出的所有警告,那么可以对变量使用unused属性,它告诉编译器该变量不准备使用.下面的变量声明会消除警告:
  float big_salary __attribute__ ((unused));

使用case区间
case区间是一个非常有用的扩展.其语法如下:
  case LOWVAL ... LOWVAL:
注意,在省略号前后必须有空格.在switch语句中,case区间指定了落在LOWVAL和HIVAL区间内的那些整数值.例如:
  switch(int_var) {
  case 0 ... 2:
    /* your code here */
    break;
  case 3 ... 5:
    /* more code here */
    break;
  default:
    /* default code here */
  }

构造函数名称
  把函数名用作字符串是GNU的扩展,它能极大地简化调试工作.gcc预先定义了变量__FUNCTION__为当前函数(控制流程当前所在的位置)的名字,就好像它被写在源代码里去了一样.

使用__FUNCTION__变量
/*
*  showit.c - Illustrate using the __FUNCTION__ variable
*/
#include <stdio.h>

void foo(void);

int main(void)
{
  printf("The current function is %s\n", __FUNCTION__);
  foo();
  return 0;
}

void foo(void)
{
  printf("The current function is %s\n", __FUNCTION__);
}
posted on 2005-08-04 21:55 ivaneeo 阅读(602) 评论(0)  编辑  收藏 所属分类: gcc小试牛力

只有注册用户登录后才能发表评论。


网站导航: