巧妙的宏定义
之前在写南京大学的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; }
从上面例子其实就可以很容易理解第三部分了.
参考文献:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律