[C.C++] C/C++开发,利用c语言中宏定义及宏替换特性构建自己的log输出

478 0
Honkers 2025-3-7 15:10:51 来自手机 | 显示全部楼层 |阅读模式

目录

一、c语言的宏定义及宏替换特性

二、采用宏定义实现打印输出

三、编译及测试


一、c语言的宏定义及宏替换特性

        宏定义是比较常用的预处理指令,在预处理过程中,预处理器会把源程序中所有宏名,替换成宏定义中替换列表中的内容。

        宏定义有两种,不带参数的宏定义和带参数的宏定义。

       不带参数的宏定义:     #define 宏名   宏体

        带参数的宏定义:        #define 宏名(参数表)    宏体

        其中参数表示多个参数采用‘,’隔开;还有一个有意思的设定就是,当宏体一行写不下时,可以使用反斜线\作为续行符延续到下一行,理论上这样就支持到无限复杂的替换内容。

二、采用宏定义实现打印输出

        设计前先了解几个基本概念,

        【1】##用于将其左右两侧的操作符连接成一个操作符

        【2】__VA_ARGS__表示该部分允许输入可变参数,这个是C99标准中的内容

        【3】##__VA_ARGS__则是支持可变参数的输入或者无参数输入

        OK,先假设我们采用的宏定义日志输出,共有多个日志等级,构建print函数类似于宏定义myprint.h如下:

  1. typedef enum PrintLevel
  2. {
  3. L_NOTICE = 1, //一般输出
  4. L_WARNING = 2, //告警输出
  5. L_TRACE = 3, //追踪调试
  6. L_DEBUG = 4, //软件bug
  7. L_FATAL = 5 //致命错误
  8. }PrintLevel;
  9. #define MyPrint(level,log_fmt,...) \
  10. do{ \
  11. switch(level) \
  12. { \
  13. case L_FATAL: \
  14. printf("L(5,FATAL)[%s:%d][%s] \n"log_fmt"\n", __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__); \
  15. break;\
  16. case L_DEBUG: \
  17. printf("L(4,DEBUG)[%s:%d][%s] \n"log_fmt"\n", __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__); \
  18. break;\
  19. case L_TRACE: \
  20. printf("L(3,TRACE)[%s:%d][%s] \n"log_fmt"\n", __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__); \
  21. break;\
  22. case L_WARNING: \
  23. printf("L(2,WARNING)[%s:%d][%s] \n"log_fmt"\n", __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__); \
  24. break;\
  25. case L_NOTICE: \
  26. printf("L(1,NOTICE)[%s:%d][%s] \n"log_fmt"\n", __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__); \
  27. break;\
  28. default: \
  29. printf("L(-1,UNKOWN)[%s:%d][%s] \n"log_fmt"\n", __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__); \
  30. break;\
  31. } \
  32. }while (0)
复制代码

        宏测试main.c代码如下

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #inlcude "myprint.h"
  4. int main(void){
  5. MyPrint(2,"my notice %d\n",1);
  6. system("pause");
  7. return 0;
  8. }
复制代码

三、编译及测试

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Honkers

荣誉红客

关注
  • 4009
    主题
  • 36
    粉丝
  • 0
    关注
这家伙很懒,什么都没留下!

中国红客联盟公众号

联系站长QQ:5520533

admin@chnhonker.com
Copyright © 2001-2025 Discuz Team. Powered by Discuz! X3.5 ( 粤ICP备13060014号 )|天天打卡 本站已运行