宏的一些常用使用

本文介绍了一组用于C++编程的实用宏定义,包括获取变量地址、读取内存单元、获取结构体成员偏移量及大小等功能,并演示了如何在实际代码中应用这些宏。
#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;
}

 

转载于:https://www.cnblogs.com/linuxAndMcu/p/7726080.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值