先看代码:
#include <stdio.h>
#include <string.h>// 定义一个宏,用于定义结构体
#define DEFINE_STRUCT(name, type1, name1, type2, name2, size, cf) \typedef struct { \type1 name1; \type2 name2[size]; \void(*cf)(void); \} name;// 使用宏定义一个结构体,指定字符数组的大小
DEFINE_STRUCT(Person, int, age, char, name, 50, cft)void print_callback(void) {printf("Hello, world!\n");
}// 定义一个宏,用于初始化结构体
#define INIT_PERSON(p, a, n, cb) do { \(p).age = (a); \strncpy((p).name, (n), sizeof((p).name) - 1); \(p).name[sizeof((p).name) - 1] = '\0'; \(p).cft = cb; \
} while(0)// 定义一个宏,用于打印结构体成员
#define PRINT_PERSON(p) do{ \printf("Age: %d, Name: %s\n", (p).age, (p).name);\(p).cft(); \
} while(0)int main() {// 创建一个 Person 结构体实例Person person;// 使用宏初始化结构体INIT_PERSON(person, 25, "Alice", print_callback);// person.callback();// 使用宏打印结构体成员PRINT_PERSON(person);return 0;
}
这段代码种很灵活定义了结构体中参数和函数。
很多代码其实可以用宏简化。