资源简介

我的博客《百尺竿头更进一步——编译器gcc对c语言的扩展》的附件

资源截图

代码片段和文件信息

#include 
#include 
 #include 
int foo()
{

return 1;
}
/*
*将表达式的扩展
*/
#define stats() ({int i=foo();i;})

/*
*局部标记的使用 __label__ 的定义
*/
int local_label(int iint type)
{
__label__ do_add do_subdo_multido_div;
switch(type){
case 1:
goto do_add;
case 2:
goto do_sub;
case 3:
goto do_multi;
case 4:
goto do_div;
}
do_add:
return i++;
do_sub:
return i--;
do_multi:
return i*i;
do_div:
return 1/i;
}
/*
*将标签当作变量来使用标签被以“&&“开头来引用被以“void*“的指针来指向,被goto时需要用*来得到其值
*/
int label_val(int iint type)
{
  void* label_array[]={ &&do_add &&do_sub&&do_multi&&do_div};

goto *label_array[type];
do_add:
return i++;
do_sub:
return i--;
do_multi:
return i*i;
do_div:
return 1/i;
}
/**
*内部函数,在函数内部定义函数
*1.内部函数可以使用函数定义的局部变量。
*2.如果先声明,再定义,需要用auto来声明。
*3.如果内部函数需要被外部使用,可以以函数指针的形式被引用。
*/
int nested_func(int aint b)
{
auto int add();
int do_add(int(*add)()){
return add();
}
int c = do_add(add);
if(c>0)
return c;
else
return 0;
int add(){ return a+b;}
}
/**
*内置函数( built-in functions )
*void * __builtin_apply_args ()
*/
void error(const char* fmt ...) {
    void *args = __builtin_apply_args();
 
    fprintf(stderr “error: “);
    fflush(stderr);
    __builtin_apply(printf args 100);
}

int built_func(int a)
{
error(“input a:%d\n“a);
return a;
}
/**
*内置函数得到调用者的信息,用于调试系统
*/
void built_func_caller()
{
printf(“caller 0:0x%x\n“ __builtin_return_address(0));
printf(“caller 1:0x%x\n“ __builtin_return_address(1));
}
/**
*typeof的使用,获取变量的类型。
*/
#define max(ab) \
       ({ typeof (a) _a = (a); \
           typeof (b) _b = (b); \
         _a > _b ? _a : _b; })
#define Max(ab) ((a)>(b)?(a):(b))
/*
*扩展标准c表达式的灵活处理
*1.结构体与数组的初始化
*2.case 语句的连续表示
*3.“?:“运算符的简化
*4.长度为0的数组:定义时,节约空间
*5.长度可变的数组
*6.可变参数的宏定义
*7.数组非常量初始化
*8.灵活的动态数据转换
*9.混合声明与定义
*10.offsetof(typemember)的使用:得到member在结构体type中的偏移(stddef.h)中定义,
*一个重要的实例——container_of(通过局部指针得到整体指针)在linux内核中,链表的使用。
*/
/*
* container_of - cast a member of a structure out to the containing structure
 * @ptr: the pointer to the member.
 * @type: the type of the container struct this is embedded in.
 * @member: the name of the member within the struct.
*/
#define container_of(ptr type member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(typemember) );})

  #define debug(format ...) fprintf (stderr format## __VA_ARGS__)
  #define warning(format0args...) fprintf(stdoutformat0 args)
void basic_extend()
{
int array[5] = {[2]=1[3 ... 4]=3};

 struct point { int x y; };
 struct point p0 = {
  .x = 5
  .y =6
 };
int i =0;
int v = 8 ;
for(i=0;i<5;i++){
switch(i){
case 1 ... 3 :
 v = array[i];
break;
case 4:
 v = array[i]?:p0.y;
break;
}
}
struct line {
int len;
char  p[0];
};
struct line *one;
int len = 5;
one 

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2014-12-24 17:25  asm汇编\
     文件     2176412  2014-12-06 16:06  asm汇编\asm.tar.bz2
     文件      116616  2014-06-20 16:17  asm汇编\gas_manual-unix汇编.pdf
     文件    11238367  2014-06-20 16:17  asm汇编\IBM.PC.汇编语言程序设计(第五版)完整版.pdf
     文件      846920  2014-06-20 16:17  asm汇编\pcasm-book-x86汇编.pdf
     目录           0  2014-12-24 17:23  gcov\
     文件         185  2014-12-19 14:45  gcov\gcov-c.c
     文件         558  2014-12-24 16:50  gcov\gcov-c.c.gcov
     文件         160  2014-12-24 17:16  gcov\makefile
     文件        6271  2014-12-18 22:02  gnu-c.c

评论

共有 条评论