C语言#与##最直白的用法介绍

假设你需要封装如下接口:

cpp 复制代码
int32_t display_set_hdr_type(const dispmng_display_id id, int32_t value);
int32_t display_set_hdr_match_content(const dispmng_display_id id, int32_t value);
int32_t display_set_hdr_quality(const dispmng_display_id id, int32_t value);

他们的函数实现都非常类似。感觉写起来有许多重复的代码。那么你可以用如下的方式写:

cpp 复制代码
#define display_set_hdr(name, id, para_type, value)  \
int32_t display_set_hdr_##name(const dispmng_display_id id, int32_t value){\
    int32_t ret = -1;\
    LOGI("display_set_hdr_%s id=%d, value=%d", #name, id, value);\
    do {\
        uapi_ret_if_invalid_id(id);\
        ret = uapi_svr_dispmng_init();\
        if (ret != SUCCESS) {\
            LOGD("uapi_svr_dispmng_init() failed: %d", ret);\
            break;\
        }\
        ret = uapi_svr_dispmng_set_hdr_##name(id, (para_type)value);\
        uapi_svr_dispmng_deinit();\
    } while(0);\
    return ret;\
}


display_set_hdr(type, id, uapi_svr_dispmng_hdr_type, value)
display_set_hdr(match_content, id, bool, value)
display_set_hdr(quality, id, int32_t, value)

宏展开看一下 gcc -E macro.c -o macro.i

cpp 复制代码
# 0 "macro.c"
# 0 "<built-in>"
# 0 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 0 "<command-line>" 2
# 1 "macro.c"
# 22 "macro.c"
int32_t display_set_hdr_type(const dispmng_display_id id, int32_t value){ int32_t ret = -1; LOGI("display_set_hdr_%s id=%d, value=%d", "type", id, value); do { uapi_ret_if_invalid_id(id); ret = uapi_svr_dispmng_init(); if (ret != SUCCESS) { LOGD("uapi_svr_dispmng_init() failed: %d", ret); break; } ret = uapi_svr_dispmng_set_hdr_type(id, (uapi_svr_dispmng_hdr_type)value); uapi_svr_dispmng_deinit(); } while(0); return ret;}
int32_t display_set_hdr_match_content(const dispmng_display_id id, int32_t value){ int32_t ret = -1; LOGI("display_set_hdr_%s id=%d, value=%d", "match_content", id, value); do { uapi_ret_if_invalid_id(id); ret = uapi_svr_dispmng_init(); if (ret != SUCCESS) { LOGD("uapi_svr_dispmng_init() failed: %d", ret); break; } ret = uapi_svr_dispmng_set_hdr_match_content(id, (bool)value); uapi_svr_dispmng_deinit(); } while(0); return ret;}
int32_t display_set_hdr_quality(const dispmng_display_id id, int32_t value){ int32_t ret = -1; LOGI("display_set_hdr_%s id=%d, value=%d", "quality", id, value); do { uapi_ret_if_invalid_id(id); ret = uapi_svr_dispmng_init(); if (ret != SUCCESS) { LOGD("uapi_svr_dispmng_init() failed: %d", ret); break; } ret = uapi_svr_dispmng_set_hdr_quality(id, (int32_t)value); uapi_svr_dispmng_deinit(); } while(0); return ret;}

是不是觉得#跟##用起来很清爽了?

相关推荐
2601_949146533 小时前
C语言语音通知接口接入教程:如何使用C语言直接调用语音预警API
c语言·开发语言
知南x5 小时前
【Ascend C系列课程(高级)】(1) 算子调试+调优
c语言·开发语言
2的n次方_7 小时前
Runtime 执行提交机制:NPU 硬件队列的管理与任务原子化下发
c语言·开发语言
凡人叶枫8 小时前
C++中智能指针详解(Linux实战版)| 彻底解决内存泄漏,新手也能吃透
java·linux·c语言·开发语言·c++·嵌入式开发
凡人叶枫9 小时前
C++中输入、输出和文件操作详解(Linux实战版)| 从基础到项目落地,避坑指南
linux·服务器·c语言·开发语言·c++
傻乐u兔10 小时前
C语言进阶————指针3
c语言·开发语言
CodeSheep程序羊12 小时前
拼多多春节加班工资曝光,没几个敢给这个数的。
java·c语言·开发语言·c++·python·程序人生·职场和发展
I'mChloe12 小时前
PTO-ISA 深度解析:PyPTO 范式生成的底层指令集与 NPU 算子执行的硬件映射
c语言·开发语言
2的n次方_12 小时前
Runtime 内存管理深化:推理批处理下的内存复用与生命周期精细控制
c语言·网络·架构
嵌入小生00712 小时前
标准IO---核心函数接口延续(嵌入式Linux)
c语言·vscode·vim·嵌入式·小白·标准io·函数接口