builtin

http://tigcc.ticalc.org/doc/gnuexts.html#SEC67

 

file:///F:/firefoxfile/data/20110609171334/index.html#5.1

 

 

#include <stdio.h>
/* typeof(x),可以得到x的类型。 */
#define ADD(a,b)  ({ typeof(a) _a = a; /
typeof(b) _b = b; /
typeof(b) _c = _b+_a;/
_c;/   /* 此句类似于函数的return _c;作为宏的返回值,或是宏的值。 */
})


int minus(int a,int b);


int minus(int a,int b)
{
     printf("minus ret =%s/n",__FUNCTION__);
    return a-b;
}

int add(int a,int b)
{
     void* args = NULL;
     void* built_ret = NULL;
     int   ret = 0;
     args = __builtin_apply_args();  /* 得到调用函数的参数信息(这里的调用函数就是add),信息的地址保存于args中。 */
     built_ret = __builtin_apply( minus,args,20); /* 把args的参数信息提交给minus函数,作为minus的参数,并运行minus,第三个参数,表示args所指的参数信息的大小。这个由用户自己来定。 */
     /* void * __builtin_apply (void (*function)(), void *arguments, size_t size);所以在minus之前加一个(void(*))把函数指针转一下,就没有以下的
     warning了.
     build_in.c:25: warning: passing argument 1 of "__builtin_apply" from incompatible pointer type
     */
//built_ret = __builtin_apply((void(*))minus,args,20);
     printf("minus ret =%d/n",*(int*)built_ret); /* built_ret接收了__builtin_apply函数的返回值,此值就是minus函数的返回值信息的地址,进行转化后,可以得到minus的返回值。 */
     /* __builtin_ret() 的参数一定是__builtin_apply函数的返回值,此函数的作用是以minus函数返回值为add返回值,通用的说就是以__builtin_apply第一参数所指的函数的返回值作为调用者的返回值。
     同时在这里重点提一句,__builtin_apply第一参数所指的函数的参数一定要与调用者的参数是完全一致。 */
//     __builtin_return(built_ret);


     return a+b;
}

int main()
{
     int ma=5;
     int mb=10;
     int mADD_sum = 0;
     int mbuild_in_sum = 0;
     void* args = NULL;

     mADD_sum = ADD(ma,mb);
     printf("mADD_sum = %d/n",mADD_sum);

printf("add = %d/n",add(4,3));
    
    
}

你可能感兴趣的:(c,function,File,null,Build)