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

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

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

相关推荐
kobesdu几秒前
laser_line_extraction线段提取开源功能包解读和使用例程
人工智能·算法·机器人·ros
abant21 分钟前
leetcode 105 前序中序构建二叉树
算法·leetcode·职场和发展
6Hzlia5 分钟前
【Hot 100 刷题计划】 LeetCode 438. 找到字符串中所有字母异位词 | C++ 滑动窗口题解
c++·算法·leetcode
Mem0rin11 分钟前
[Java/数据结构]线性表之栈与队列
java·开发语言·数据结构
Mr_Xuhhh16 分钟前
深入理解Java数组:从定义到高阶应用
开发语言·python·算法
倦王17 分钟前
力扣日刷复习:
算法·leetcode·职场和发展
py有趣21 分钟前
力扣热门100题之二叉树的中序遍历
算法·leetcode·职场和发展
DFT计算杂谈26 分钟前
eDMFT安装教程
java·服务器·前端·python·算法
我不是懒洋洋27 分钟前
【数据结构】单链表专题(详细代码及配图)
c语言·数据结构·c++·算法·visual studio
j_xxx404_27 分钟前
蓝桥杯--搜索(DFS基础回溯法,剪枝,记忆化搜索)
数据结构·c++·算法·蓝桥杯·深度优先·图论