Zihao

Make small but daily progress

0%

C-宏的一些常用使用

常用的C的宏。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#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;
}
  • 本文作者: Zihao Yao
  • 本文链接: https://yaozihao.com/c_macro/
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

欢迎关注我的其它发布渠道