巧妙的宏定义

之前在写南京大学的PA的时候遇到一个比较有趣的宏定义,于是记录了下来。

宏定义:

符号扩展:

#define SEXT(x, len) ({ struct { int64_t n : len; } __x = { .n = x }; (uint64_t)__x.n; })

我们将其进行拆分为三部分来分别分析:

 

要理解第一部分需要理解:http://www.catb.org/esr/structure-packing/#_bitfields

 例子:

struct foo6 {
    short s;       /* 2 bytes */
    char c;        /* 1 byte */
    int flip:1;    /* total 1 bit */
    int nybble:4;  /* total 5 bits */
    int pad1:3;    /* pad to an 8-bit boundary */
    int septet:7;  /* 7 bits */
    int pad2:25;   /* pad to 32 bits */
};

以int pad2为例,其实就是将其扩展位32bit.

要理解第二部分需要理解:https://blog.csdn.net/lxgwm2008/article/details/7832502

其实就是将n进行初始化位x,而后赋值给_x.

要理解第三部分需要理解:ttps://blog.csdn.net/fly1000fans/article/details/70210419

例子:

#include <stdio.h>
 
int main()
{
    int a = 10;
 
    a = ({ int c = 0; c = 5 + 6;});
            
    printf("a = %d\n", a);
    return 0;
}

从上面例子其实就可以很容易理解第三部分了.

 

 

 参考文献:

理解并使用巧妙的宏定义 | 一生一芯讨论区 (oscc.cc)

posted @ 2022-10-06 12:47  想撸猫猫  阅读(281)  评论(0编辑  收藏  举报