1.对齐:__alignof__
#include <stdio.h> typedef struct { double dvalue; int ivalue; } showal; int main(int argc, char *argv[]) { printf("__alignof__(char)=%d\n", __alignof__(char)); printf("__alignof__(short)=%d\n", __alignof__(short)); printf("__alignof__(int)=%d\n", __alignof__(int)); printf("__alignof__(long)=%d\n", __alignof__(long)); printf("__alignof__(long long)=%d\n", __alignof__(long long)); printf("__alignof__(float)=%d\n", __alignof__(float)); printf("__alignof__(double)=%d\n", __alignof__(double)); printf("__alignof__(showal)=%d\n", __alignof__(showal)); return 0; }
2.匿名联合
struct { int a; union { char a; int b; } } xx;
xx.a, xx.b
3.变长数组
4.零长数组
定义在结构体最后一个
5.属性:__attribute__
定义在函数原型处或者变量,结构体等处;但是不同的地方可以定义的属性是不一样的,可以参阅属性表
((noreturn,逗号分割));
6.返回值的复合语句
return ({
//内部都可以定义自己的变量,返回最后一句的值和类型,常用于复杂的宏定义,不过不兼容C++
});
6.不完全的枚举类型
无需定义完整的枚举类型,只需声明名称,用于头文件;
7.函数参数构造
跟javascript中的apply是一样的用法,不过这个地方提供了三个函数来完成:
1): void * __builtin_apply_args(void):获取参数集合
2): void * __builtin_apply(void (*func)(), void *arguments, int size); 将参数传递给新的函数地址,size需要足够大来复制参数集;
int passthrough(int a,int b,int c) { void *record; void *playback; void (*fn)() = (void(*)()) average; record = __builtin_apply_args(); playback = __builtin_apply(fn, record, 128); __builtin_return(playback); } int average(int a, int b, int c) { return ((a+b+c)/3); }
3).: __builtin_reutrn(void *result): 返回处理结果
8.函数嵌套
9.函数原型;
10.函数返回地址和堆栈框架
__builtin_return_address();
__builtin_frame_address();
11.左值表达式
这个太科幻,我觉得还是少用,@_@
12.可变参数的宏定义
1). #define errout(fmt,...) fprintf(stderr,fmt, __VA_ARGS__); ==>ISO
2).#define errout(fmt,...) fprintf(stderr,fmt, args); ==>GNU
13.Switch/Case分支语句:
case 8 ... 12: xx break;
case 'a' ... 'p': oo break;
14.typeof sizeof
确实不知道typeof能在什么场景使用
char *xx;
typeof(char *) == char