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__);
}