1.对齐
__alignof__操作符返回数据类型或指定数据项的分界对齐(boundary alignment).
如: __alignof__(long long);
2.匿名联合
在结构中,可以声明某个联合而不是指出名字,这样可以直接使用联合的成员,就好像它们是结构中的成员一样。
例如:
struct {
char code;
union {
chid[4];
int unmid;
};
char* name;
} morx;
可以使用morx.code, morx.chid, morx.numid和morx.name访问;
3.变长数组
数组的大小可以为动态值,在运行时指定尺寸.
例如:
void add_str(const char* str1, const char* str2)
{
char out_str[strlen(str1)+strlen(str2)+2];
strcpy(out_str, str1);
strcat(out_str, " ");
strcat(out_str, str2);
printf("%s\n", out_str);
}
变长数组也可作为函数参数传递。
如:
void fill_array(int len, char str[len])
{
...
}
4.零长度数组
允许创建长度为零的数组,用于创建变长结构.只有当零长度数组是结构体的最后一个成员
的时候,才有意义.
例如:
typedef struct {
int size;
char str[0];
}vlen;
printf("sizeof(vlen)=%d\n", sizeof(vlen)), 结果是sizeof(vlen)=4 .
也可以将数组定义成未完成类型也能实现同样功能.
例如:
typedef struct {
int size;
char str[];
}vlen;
vlen initvlen = {4, {’a’, ’b’, ’c’, ’d’}};
printf("sizeof(initvlen)=%d\n", sizeof(initvlen));
5.属性关键字__attribute__
__attribute__可以为函数或数据声明赋属性值.给函数分配属性值主要是为了执行优化处理.
例如:
void fatal_error() __attribute__ ((noreturn)); //告诉编译器该函数不会返回到调用者.
int get_lim() __attribute__ ((pure, noline)); //确保函数不会修改全局变量,
//而且函数不会被扩展为内嵌函数
struct mong {
char id;
int code __attribute__ ((align(4));
};
声明函数可用的属性:
alias, always_inine, const, constructor, deprecated, destructor, format,format_arg,
malloc, no_instrument, _function, noinline, noreturn, pure, section, used, weak
声明变量可用的属性:
aligned, deprecated, mode, nocommon, packed, section, unused, vector_size, weak
声明数据类型可用的属性:
aligned, deprecated, packed, transparent_union, unused
6.具有返回值的复合语句
复合语句是大括号包围的语句块, 其返回值是复合语句中最后一个表达式的类型和值.
例如:
ret = ({
int a = 5;
int b;
b = a+3;
});
返回值ret的值是8.
7.条件操作数省略
例如:
x = y? y:z;
如果y为表达式,则会被计算两次,GCC支持省略y的第二次计算
x = y? : z;
以消除这种副作用.
8.枚举不完全类型
可以无需明确指定枚举中的每个值, 声明方式和结构一样, 只要声明名字, 无需指定内容.
例如:
enum color_list;
.....
enum color_list {BLACK, WHITE, BLUE};
9.函数参数构造
void* __builtin_apply_args(void);
void* __builtin_apply(void (*func)(), void* arguments, int size);
__builtin_return(void* result);
10.函数内嵌
通过关键字inline将函数声明为内嵌函数, ISO C中的相应关键字是__inline__
11.函数名
内嵌宏__FUNCTION__保存了函数的名字, ISO C99中相应的宏是__func__
12.函数嵌套
支持函数内嵌定义, 内部函数只能被父函数调用.
13.函数原型
新的函数原型可以覆盖旧风格参数列表表明的函数定义, 只要能够和旧风格参数的升级相匹配
既可.
例如:
下面可用的函数原型, 在调用是short参数可以自动升级为int
int trigzed(int zvalue);
......
int trized(zvalue)
short zvalue;
{
return (zvalue==0);
}