宏的一些常用使用
#include <iostream> #include <string.h> using namespace std; //定义类型的别名 typedef unsigned char byte; typedef unsigned short word; //获得一个变量的地址(byte或word宽度) #define B_PTR(var) (byte*)((void *)(&var)) #define W_PTR(var) (word*)((void *)(&var)) //得到指定地址上的一个字节或字 #define MEN_B(arr) *((byte*)arr) #define MEN_W(arr) *((word*)arr) //得到一个字的高位和低位字节 #define WORD_LO(xxx) ((byte) ((word)(xxx) & 255)) // == &0xff #define WORD_HI(xxx) ((byte) ((word)(xxx) >> 8)) // == /256 //获得结构体成员在结构体中偏移量 #define STRUCT_MEN_POS(type,member) (unsigned int)&((type *)0)->member //得到一个结构体中成员变量所占用的字节数 #define STRUCT_MEN_SIZE(type,member) sizeof( ((type*)0)->member ) //返回数组元素的个数 #define ARR_SIZE(arr) sizeof(arr)/sizeof(arr[0]) //使用#把宏参数变为一个字符串,用##把两个宏参数贴合在一起 #define STR(s) #s #define STR2(a,b) a##b struct student { char name[10]; int age; int id; }my_student; int main(void) { int a = 23; //获得一个变量的地址: 0X28FEA8 cout << W_PTR(a) <<endl; //得到指定地址上的一个字: 23 cout << MEN_W(W_PTR(a)) <<endl; //获得结构体成员在结构体中偏移量: 12 (要求为4的整数倍) cout << STRUCT_MEN_POS(struct student,age) << endl; //得到一个结构体中成员变量所占用的字节数: 10 cout << STRUCT_MEN_SIZE(struct student,name) << endl; //10 //使用#把宏参数变为一个字符串: abc cout << STR(abc) << endl; //用##把两个宏参数贴合在一起: 234 cout << STR2(2,34) << endl; }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!