先看代码:
#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;
}
这段代码种很灵活定义了结构体中参数和函数。
很多代码其实可以用宏简化。