免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
26
处女座
日期:2016-04-18 14:00:4515-16赛季CBA联赛之深圳
日期:2020-06-02 10:10:5015-16赛季CBA联赛之广夏
日期:2019-07-23 16:59:452016科比退役纪念章
日期:2019-06-26 16:59:1315-16赛季CBA联赛之天津
日期:2019-05-28 14:25:1915-16赛季CBA联赛之青岛
日期:2019-05-16 10:14:082016科比退役纪念章
日期:2019-01-11 14:44:062016科比退役纪念章
日期:2018-07-18 16:17:4015-16赛季CBA联赛之上海
日期:2017-08-22 18:18:5515-16赛季CBA联赛之江苏
日期:2017-08-04 17:00:4715-16赛季CBA联赛之佛山
日期:2017-02-20 18:21:1315-16赛季CBA联赛之天津
日期:2016-12-12 10:44:23
11 [报告]
发表于 2016-04-18 10:58 |只看该作者
不是说宏里面的变量不能被展开么?

论坛徽章:
0
12 [报告]
发表于 2016-04-18 12:19 |只看该作者
多谢回复。
我之前的描述可能把你搞晕了。所以重新更新了一下问题。 谢谢!
回复 10# 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
13 [报告]
发表于 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)
复制代码

论坛徽章:
1
15-16赛季CBA联赛之同曦
日期:2016-04-23 22:00:26
14 [报告]
发表于 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
15 [报告]
发表于 2016-04-20 12:50 |只看该作者
lwhjava 发表于 2016-04-19 22:13
回复 13# yulihua49

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

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
16 [报告]
发表于 2016-04-20 14:03 |只看该作者
回复 15# yulihua49


    我是有Info Warn Error等几种函数,然后统一配置tag作为不同模块的标示,调试时候Info Warn Error里面看有没有配置相应的tag,配置了就输出,没配置的不输出,当然还分日志记录方式比如控制台或者文件

    加个tag之后想只调试某些模块可以很方便屏蔽其他模块的输出,看日志舒服些。不过像数据分析那样对日志做过滤也方便

论坛徽章:
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
17 [报告]
发表于 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
复制代码

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
18 [报告]
发表于 2016-04-21 17:58 |只看该作者
回复 17# yulihua49


    对对对,这样好用我的也是

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
19 [报告]
发表于 2016-04-22 22:25 |只看该作者
cokeboL 发表于 2016-04-15 16:17
码农最大的悲哀是该产品导向的场景,非要语言语法导向,费力不讨好,除了看上去语法牛逼不容易看懂,然并卵。


你这就快走到另外一个极端了:技术无用论。

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
20 [报告]
发表于 2016-04-23 11:19 |只看该作者
回复 19# MMMIX


不是的,我只是不纠结于语法,并不是反对钻研技术。

因为见过太多纠结于语法的cpper了,有哥们面试遇到语法党面试官,专问各种语言特性,然后压价,
不排除有项目就是需要这些,或者就是需要这种语法精通的人,但是绝大多数,都是不需要如此的搬砖
职位罢了。cpp的鄙视java的,java的鄙视c#的,而同是c++的又要通过语法、标准来形成鄙视链,对
技术的钻研是非常非常棒的事情,但现实中的情况是很大一部分人会因为自己对语言投入了太多精力而
过度迷恋语言本身,从而导致了鄙视链之类的事情,这样的态度对待编程语言我觉得对做事没有好处。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP