操作系统:centos
编译器:gcc
宏函数(块结构表达式)
可以代替一段函数,而且有返回值。
#include <stdio.h>
#define kaddr(addr)\
({\
int tmp = addr;\
if (addr > 5) \
tmp = 2;\
else\
tmp = 3;\
(addr+tmp);\
})\
int main() {
int addr = 4;
int ans;
ans = kaddr(addr);
printf("%d.\n", ans);
addr = 8;
ans = kaddr(addr);
printf("%d.\n", ans);
return 0;
}
编译:[root@localhost testc]# gcc test.c -o test
结果:
[root@localhost testc]# ./test
7.
10.
参考:https://blog.csdn.net/huangkangying/article/details/6321398
// 有返回值的宏函数
#define get_seg_byte(seg, addr) \
({ \
register char __res; \ // 定义了一个寄存器变量__res
__asm__("push %%fs; \ // 这行开始的4行是汇编语句,语法是AT&T
mov %%ax, %%fs; \
movb %%fs:%2, %%al; \
pop %%fs" \
: "=a" (__res) \ // 输出寄存器,=代表是输出寄存器,a代表eax,运行结束后将eax里的值放入__res变量中
: "0" (seg), "m" (*(addr))); \ // 输入寄存器,0表示与上面相同位置上的输出寄存器,eax;m表示使用内存地址
__res;}) // 返回值
输入和输出寄存器后面的括号里面是c语言表达式值或一个内存地址