C语言 宏 返回值

操作系统: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语言表达式值或一个内存地址

猜你喜欢

转载自blog.csdn.net/familyshizhouna/article/details/81205808