免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: xhx321
打印 上一主题 下一主题

[C] 请问如何将指定字符串动态定义为宏 [复制链接]

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
1 [报告]
发表于 2016-04-18 10:17 |显示全部楼层
本帖最后由 yulihua49 于 2016-04-18 10:25 编辑
xhx321 发表于 2016-04-15 12:21
想实现这样的功能。在一个.c里有多个管理打印的宏。例如:O_DEBUG, O_TRACE,O_ERROR,各自有其打印的级别l ...

你看这个行吗?


  1. int ShowLog(int DEBUG_level,const char *fmt,...);

  2. #define EMASS_LOG_DEBUG (5)
  3. #define EMASS_LOG_VERBOSE (4)
  4. #define EMASS_LOG_INFO (3)
  5. #define EMASS_LOG_WARN (2)
  6. #define EMASS_LOG_ERROR (1)

  7. #define EMAS_DEBUG(fmt, arg...) ShowLog(EMASS_LOG_DEBUG, "[D][T:%lx] %s(%d) "fmt, pthread_self(), __FILE__, __LINE__, ##arg)
  8. #define EMAS_VERBOSE(fmt, arg...) ShowLog(EMASS_LOG_VERBOSE, "[V][T:%lx] %s(%d) "fmt, pthread_self(), __FILE__, __LINE__, ##arg)
  9. #define EMAS_INFO(fmt, arg...) ShowLog(EMASS_LOG_INFO, "[I][T:%lx] %s(%d) "fmt, pthread_self(), __FILE__, __LINE__, ##arg)
  10. #define EMAS_WARN(fmt, arg...) ShowLog(EMASS_LOG_WARN, "[W][T:%lx] %s(%d) "fmt, pthread_self(), __FILE__, __LINE__, ##arg)
  11. #define EMAS_ERR(fmt, arg...) ShowLog(EMASS_LOG_ERROR, "[E][T:%lx] %s(%d) "fmt, pthread_self(), __FILE__, __LINE__, ##arg)
复制代码

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
2 [报告]
发表于 2016-04-18 12:47 |显示全部楼层
本帖最后由 yulihua49 于 2016-04-18 13:23 编辑
xhx321 发表于 2016-04-15 12:21
貌似原来的描述把问题写的很乱, 也没表述清楚需求及重点。在这里重新写一下:
需要实现一个宏定义:O_P ...

你这个方法是错误的,无法实现。
你还是看看我给你的例子,可以实现你的要求。函数名和文件名的用法一样,改成
__FUNCTION__
就可以了。tlog.c:

  1. #include <strproc.h>
  2. #include <log.h>

  3. int main(int argc,char *argv[])
  4. {
  5.         if(argc>1) envcfg(argv[1]);
  6.         EMAS_DEBUG("myname is %s",argv[0]);
  7.         EMAS_ERR("PID is %d",getpid());
  8.         return 0;
  9. }
复制代码
结果:

  1. 5  04/18 20:45'53 [D][T:7f7758e5d740] tlog.c(7) myname is ./tlog
  2. 1  04/18 20:45'53 [E][T:7f7758e5d740] tlog.c(8) PID is 26996
复制代码
系统时间设置的不对,这别管了,改成函数名也很简单。

是不是你要的结果?

给你改个带函数名的:
结果:

  1. 5  04/18 20:53'53 [D][T:7f0e8c42c740] tlog.c(7) main: myname is ./tlog
  2. 1  04/18 20:53'53 [E][T:7f0e8c42c740] tlog.c(8) main: PID is 29250
复制代码
log.h:


  1. #define EMAS_DEBUG(fmt, arg...) ShowLog(EMASS_LOG_DEBUG, "[D][T:%lx] %s(%d) %s: "fmt, pthread_self(), __FILE__, __LINE__, __FUNCTION__, ##arg)
  2. #define EMAS_VERBOSE(fmt, arg...) ShowLog(EMASS_LOG_VERBOSE, "[V][T:%lx] %s(%d) %s: "fmt, pthread_self(), __FILE__, __LINE__, __FUNCTION__, ##arg)
  3. #define EMAS_INFO(fmt, arg...) ShowLog(EMASS_LOG_INFO, "[I][T:%lx] %s(%d) %s: "fmt, pthread_self(), __FILE__, __LINE__, __FUNCTION__, ##arg)
  4. #define EMAS_WARN(fmt, arg...) ShowLog(EMASS_LOG_WARN, "[W][T:%lx] %s(%d) %s: "fmt, pthread_self(), __FILE__, __LINE__, __FUNCTION__, ##arg)
  5. #define EMAS_ERR(fmt, arg...) ShowLog(EMASS_LOG_ERROR, "[E][T:%lx] %s(%d) %s: "fmt, pthread_self(), __FILE__, __LINE__, __FUNCTION__, ##arg)
复制代码

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
3 [报告]
发表于 2016-04-20 12:50 |显示全部楼层
lwhjava 发表于 2016-04-19 22:13
回复 13# yulihua49

我们采取一个日志函数+多个级别宏,而不采取多个函数的方式。
单个的函数还可以可变级别,就是级别可以是变量,有利于动态设置级别。

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
4 [报告]
发表于 2016-04-21 11:47 |显示全部楼层
本帖最后由 yulihua49 于 2016-04-21 11:59 编辑
cokeboL 发表于 2016-04-20 14:03
回复 15# yulihua49

我这个日志系统是可以加TAG的:
结果:

  1. 5 ./tlog:2930:  04/21 19:18'43 [D][T:7ff4fd92e740] tlog.c(9) main: myname is ./tlog
  2. 1 ./tlog:2930:  04/21 19:18'43 [E][T:7ff4fd92e740] tlog.c(10) main: PID is 2930
复制代码
程序:

  1. #include <strproc.h>
  2. #include <log.h>
  3. static char tag[100];
  4. int main(int argc,char *argv[])
  5. {
  6.         if(argc>1) envcfg(argv[1]);
  7.         sprintf(tag,"%s:%d: ",argv[0],getpid());
  8.         Showid=tag;
  9.         EMAS_DEBUG("myname is %s",argv[0]);
  10.         EMAS_ERR("PID is %d",getpid());
  11.         return 0;
  12. }
复制代码
还可以按线程分别TAG。

配置了TAG就用,不配置就没有TAG。
日志还是有的,显示级别和TAG两回事。

配置成3级,5级的就自动没有了:

  1. 5 ./tlog:2930:  04/21 19:18'43 [D][T:7ff4fd92e740] tlog.c(9) main: myname is ./tlog
  2. 1 ./tlog:2930:  04/21 19:18'43 [E][T:7ff4fd92e740] tlog.c(10) main: PID is 2930
  3. 1 ./tlog:3474:  04/21 19:26'21 [E][T:7f0a1c8a7740] tlog.c(10) main: PID is 3474
复制代码
前两行是5级的,后一行是3级的。
配置内容:

  1. LOGFILE=./LOG
  2. LOGLEVEL=3
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP