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));
}