C语言宏和结构体的使用代码

先看代码:

cpp 复制代码
#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;
}

这段代码种很灵活定义了结构体中参数和函数。

很多代码其实可以用宏简化。

相关推荐
im_AMBER14 分钟前
手撕hot100之矩阵!看完这篇就AC~
javascript·数据结构·线性代数·算法·leetcode·矩阵
笨笨饿20 分钟前
#79_NOP()嵌入式C语言中内联汇编宏的抽象封装模式研究
linux·c语言·网络·驱动开发·算法·硬件工程·个人开发
如君愿36 分钟前
考研复习 Day 30 | 习题--计算机网络 第五章(运输层 上)、数据结构 图(上)
数据结构·计算机网络·课后习题
weixin_4217252640 分钟前
C语言中volatile关键字怎么用C语言volatile在多线程中的作用
c语言·数据结构·运算符优先级·变量命名·volatile关键字
星河耀银海43 分钟前
C语言与数据库交互:SQLite实战与数据持久化
c语言·数据库·sqlite·交互
风萧萧19991 小时前
问答样例如何在RAG问答中使用?
算法
七夜zippoe1 小时前
DolphinDB分区策略:HASH分区与COMPO分区
算法·哈希算法·hash·dolphindb·compo
沪漂阿龙2 小时前
程序员面试技术爆款文:2026大厂算法通关手册——从零基础到LeetCode刷穿,这一篇就够了
算法·leetcode·面试
05候补工程师2 小时前
【408 从零到一】线性表逻辑特征、存储结构对比与 C/C++ 动态内存分配避坑指南
c语言·开发语言·数据结构·c++·考研
傻瓜搬砖人3 小时前
第五章习题
c语言·谭浩强·绿皮书第三版