C语言扩展

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

 

 

 

 

 

 

你可能感兴趣的:(gcc)