免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 5276 | 回复: 20

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

论坛徽章:
0
发表于 2016-04-15 12:21 |显示全部楼层
本帖最后由 xhx321 于 2016-04-18 12:17 编辑


貌似原来的描述把问题写的很乱, 也没表述清楚需求及重点。在这里重新写一下:
需要实现一个宏定义:O_PRINT_NAME_REGISTER(DEBUG_STRING_NAME)
例如:

************ 1.C ***********
O_PRINT_NAME_REGISTER(NET_TRACE)
O_PRINT_NAME_REGISTER(MAIN_TRACE)

void example(void)
{
     NET_TRACE(" net log");  // LINE 20
     MAIN_TRACE(" main log") // LINE 21
}

******* output *******
example - 20: net log
example - 21: main log

请注意需要能正确显示调用的行号和函数名。
请问如何实现上面这个宏 O_PRINT_NAME_REGISTER ?

论坛徽章:
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
发表于 2016-04-15 14:11 |显示全部楼层
只看标题的话我想说:你都动态了还扯什么宏

瞄了一眼需求我想说:那叫tag,你加个tag参数不就行了

论坛徽章:
0
发表于 2016-04-15 15:20 |显示全部楼层
大神or牛人,表歪楼,如果认为很简单,请把后面实现了

#define O_PRINT_NAME_REGISTER(string, level ) ?

回复 2# cokeboL


   

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
发表于 2016-04-15 15:56 |显示全部楼层

  1. struct printer {
  2.     printer(int l) : level(l) {}
  3.     void operator()(const char *msg) const { if(level >= g_print_level) std::cout << msg << std::endl; }
  4.     const int level=0;
  5. };

  6. #define O_PRINT_NAME_REGISTER(name, level) const printer name(level)
复制代码
差不多是这么个东西?

论坛徽章:
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
发表于 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
发表于 2016-04-15 16:27 |显示全部楼层
老是看见有人问奇葩的语法,普通点的正常点的写法都能实现,所以这种需求我总结就三种原因:
一是非要追求奇葩才显得逼格高
二是舍本求末没把用代码实现需求和用语法实现代码的重要性搞明白
三是想研究语法出于兴趣爱好
当然还有一种可能是上面这三种原因可能占不止一条

第三种值得鼓励,但是也别太迷恋了,其他情况,不鼓励

论坛徽章:
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
发表于 2016-04-15 16:34 |显示全部楼层
回复 4# windoze


    .c文件,没说支持c++哇。。

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
发表于 2016-04-15 20:42 |显示全部楼层
回复 7# cokeboL

我当然不可能给他一个C的,你知道我从来不代做作业。

论坛徽章:
0
发表于 2016-04-16 10:06 |显示全部楼层
本帖最后由 xhx321 于 2016-04-16 11:21 编辑

谢谢版主的回复,因为是C++的写法,我不是特别懂。请问
在这种方案下,O_DEBUG其实是被转成的函数调用么?如果是函数调用,怎么解决行号打印的问题?
例如: 在code里是这样引用的
void main(void)
{
            O_DEBUG(" print level 0 for O_DEBUG");  // LINE 20
}
希望ouput时能打印出,O_DEBUG被引用的行号20:
        main - 20 : print level 0 for O_DEBUG

另外解释一下,我手上有一个和您类似的C方案, 但是暂时无法解决行号打印的问题,同时想看看有没有不用函数的方法,才跑到这提问题,不是想来抄作业的。

@cokeboL:
        1. 标题描述的“动态定义宏”,是对预编译,预处理而言的,动态与宏并不矛盾。
        2. 当别人提问时,如果解决不了就当学生好了,能不能别说别人不该做这个事情,然后瞎指导一通。个人认为这里是技术论坛,不需要来刷存在感。
        3. 我提这个问题是有自己的需求,不需要玩什么高深技术。


回复 8# windoze


   

论坛徽章:
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
发表于 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)
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP