首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 计算机考试 > 等级考试 > 复习指导 >

C++基础:GCC的扩展语法(2)

2009-02-08 
GCC的扩展语法

    14.函数返回地址和堆栈帧
  void* __builtin_return_address(unsigned int level);
  void* __builtin_frame_address(unsigned int level);
  15.标识符
  标识符可以包含美元符号$.
  16.整数
  long long int a; //Singed 64-bit integer
  unsigned long long int b; //Unsigned 64-bit integer
  a = 8686LL;
  b = 8686ULL;
  17.更换关键字
  命令行选项-std和-ansi会使关键字asm,typeof和inline失效,但是在这里可以使用他们的
  替代形式__asm__, __typeof__和__inline__
  18.标识地址
  可以使用标识来标记地址,将它保存到指针中,再用goto语句跳转到标记处.可通过&&操作符
  返回地址.而对表达式得出的所有空指针,使用goto语句可进行跳转.
  例如:
  #include <stdio.h>
  #include <time.h>
  int main(void)
  {
  void* target;
  time_t noe;
  now = time((time_t*)NULL);
  if (now & 0x1)
  target = &&oddtag;
  else
  target = &&eventag;
  goto *target;
  enentag:
  printf("The time value %ld is even\n", now);
  return 0;
  oddtag:
  printf("The time value %ld is odd\n", now);
  return 0;
  }
  19.局部标识声明
  使用关键字__label__说明标识为局部标识,然后在该范围内使用.
  {
  __label__ restart, finished; //声明两个局部标识
  ...
  goto restart;
  }
  20.左值表达式
  赋值操作符的左边可以使用复合表达式.
  例如:
  (fn(), b) = 10; //访问复合表达式的最后一个成员变量的地址
  和fn(), (b = 10);相同
  ptr = &(fn(), b); //取复合表达式的最后一个成员的地址, ptr指向b
  ((a>5)?b:c) = 100; //条件表达式也可作为左值, 如果a大于5,则b的值是100,否则c的值是100
  21.可变参数的宏
  ISO C99创建宏的变参宏如下:
  #define errout(fmt,...) fprintf(stderr, fmt, __VA_ARGS__)
  GCC支持上面形式,同时支持下面形式:
  #define errout(fmt,args...) fprintf(stderr, fmt, args)
  22.字符串
  一行新的字符可以被嵌入到字符串中,而不需要使用转义符\n.可按照字面意思将他们包含在源码中.
  例如:
  char* str1 = "A string on\ntwo lines";
  char* str1 = "A string on
  two lines";
  上面两个字符串等价.
  字符串换行符\可以省略.
  例如:
  char* str3 = "The string will \
  be joined into one line.";
  char* str4 = "The string will
  be joined into one line.";
  上面两个字符串等价.
  23.指针运算
  支持void和函数指针加减运算,进行运算的单位是1.
  24.Switch和Case分支语句
  例如:
  支持 case 8 ... 10:
  25.typedef
  关键字typedef可根据表达式的数据类型创建数据类型.
  typedef name = expression;
  例如:
  typedef smallreal = 0.0f;
  typedef largereal = 0.0;
  smallreal real1;
  largereal real2;
  类型smallreal为单精度浮点类型, 而largereal为双精度浮点类型.
  #define swap(a,b) \
  ({ typedef _tp = a; \
  _tp temp = a; \
  a = b; \
  b = temp; })
  26.typeof
  关键字typeof可以声明类型表达式.用法与sizeof类型, 但是结果是类型而不是size.
  例如:
  char* pchar; //A char pointer
  typeof (*pchar) ch; //A char
  typeof (pchar) pcarray[10]; //Ten char pointers
  27.联合体强制类型转换
  如果数据项和联合体中成员类型相同,可以将数据项强制转为联合.
  例如:
  union dparts {
  unsigned char byte[8];
  double dbl;
  };
  double v = 3.1415;
  printf("%02X", ((union dparts)v).byte[0]);
  但是联合强制类型转换的结果不能作为左值.
  例如:
  (union dparts)v.dbl = 1.2; // Error

 


3COME考试频道为您精心整理,希望对您有所帮助,更多信息在http://www.reader8.net/exam/

热点排行