巧妙的宏定义
之前在写南京大学的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; }
从上面例子其实就可以很容易理解第三部分了.
参考文献: