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;
}

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

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

相关推荐
果壳science13 分钟前
《自然本源》如何实现狭义相对论的代数化
笔记·算法·几何学
suhan16 分钟前
【数据结构】二、线性表:2.单链表的定义与实现(带头结点与不带头结点的区别)
数据结构
302wanger1 小时前
分享一个工作习惯:整点看即时消息
算法
洋不写bug2 小时前
排序(一)基础排序,插入|希尔|冒泡|直接选择排序详解
java·算法·排序算法·插入排序·冒泡排序·希尔排序·直接选择排序
牧羊人.3332 小时前
动手学深度学习 03 | 卷积神经网络实现手写数字识别
人工智能·深度学习·神经网络·算法·cnn
AgentMaster3 小时前
数据治理工具选型指南:一套可复用的四阶段决策框架
大数据·数据结构·人工智能·算法
番茄灭世神3 小时前
汇顶模拟前端GH3220使用备忘录
c语言·单片机·传感器·模拟芯片·电生理信号处理
liliangcsdn3 小时前
最终留出样本/样本外测试集-holdout解读
算法
爱敲代码的小黄4 小时前
机器学习入门:从数据、训练到业务决策
算法
数据知道4 小时前
哈希与密码存储——bcrypt、Argon2、盐值与彩虹表
网络·算法·安全·网络安全·密码学·哈希算法