免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4738 | 回复: 12
打印 上一主题 下一主题

[C] CU牛人多,帮忙看看这个define的用法? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-04-20 06:57 |只看该作者 |倒序浏览
本帖最后由 鬼鬼一哈 于 2014-04-20 06:58 编辑
  1. #include <stddef.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <unistd.h>


  5. #define TRACE_NULL           0x0000
  6. #define TRACE_DEBUG          0x0001
  7. #define TRACE_INFO           0x0002
  8. #define TRACE_ERROR          0x0004

  9. struct test_struct {
  10.     unsigned int a;
  11.     unsigned int b;
  12. };

  13. #define dump(resrc, level, fmt, args, ...) \
  14.     do{\
  15.         printf("2.0 resource: %p\n", resrc);\
  16.         struct test_struct *Presource = (struct test_struct *)resrc ;\
  17.         printf("3.0 resource: %p, %d\n", Presource, Presource->a);\
  18.         \
  19.         if (level) {\
  20.             printf("4.0 (func:%s line:%4d):"fmt"", __func__, __LINE__,#args);\
  21.         }\
  22.     }while(0)



  23. int main() {
  24.     struct test_struct resource;
  25.     resource.a = 10;
  26.     resource.b = 20;
  27.    
  28.     printf("1.0 resource: %p, %d\n", &resource, resource.b);

  29.     dump(&resource, TRACE_DEBUG, "resource: %d\n", resource.b);
  30.    
  31. }
复制代码
执行结果为:
1.0 resource: 0xbfbdd084, 20
2.0 resource: 0xbfbdd084
3.0 resource: 0xbfbdd084, 10
4.0 (func:main line:  37):resource: 134514094 错误在哪里呢?

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
2 [报告]
发表于 2014-04-20 10:05 |只看该作者
printf("4.0 (func:%s line:%4d):"fmt"", __func__, __LINE__,#args);

引号不转义,这能编译过?

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
3 [报告]
发表于 2014-04-20 11:49 |只看该作者
没问题, 唯一可能出问题的是变参数宏的使用, 这个好像没有标准化(?), 故要说出编译器

论坛徽章:
0
4 [报告]
发表于 2014-04-20 14:17 |只看该作者

folklore 发表于 2014-04-20 11:49
没问题, 唯一可能出问题的是变参数宏的使用, 这个好像没有标准化(?), 故要说出编译器

gcc version 4.7.2 20130108

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
5 [报告]
发表于 2014-04-21 10:09 |只看该作者
##__VA_ARGS__呢?

论坛徽章:
0
6 [报告]
发表于 2014-04-21 10:39 |只看该作者
没啥,就是替代了一段代码,经常看到,整的好复杂。

论坛徽章:
0
7 [报告]
发表于 2014-04-21 12:58 |只看该作者
gcc -E 之后看到
if (0x0001) { printf("4.0 (func:%s line:%4d):""resource: %d\n""", __func__, 37,"resource.b");
%4d出来的是字符串"resource.b"在内存中的地址.

论坛徽章:
1
巨蟹座
日期:2014-03-18 23:44:30
8 [报告]
发表于 2014-04-21 13:42 |只看该作者
linux_c_py_php 发表于 2014-04-20 10:05
printf("4.0 (func:%s line:%4d):"fmt"", __func__, __LINE__,#args);

引号不转义,这能编译过?

如果单独的 printf 这样写应该需要转义,但是在宏中,预处理器能够将器替换成字符串,而 printf("a""b") 这种形式编译器是支持的,所以应该没问题。

真没看出来问题在哪里!

论坛徽章:
0
9 [报告]
发表于 2014-04-21 15:06 |只看该作者
wercedes 发表于 2014-04-21 12:58
gcc -E 之后看到
if (0x0001) { printf("4.0 (func:%s line:%4d):""resource: %d\n""", __func__, 37,"res ...


问题如七楼所说,
#define dump(resrc, level, fmt,...) \
......
            printf("4.0 (func:%s line:%4d):"fmt"", __func__, __LINE__,__VA_ARGS__);\
        }\
    }while(0)

or

#define dump(resrc, level, fmt,args...) \
.......
            printf("4.0 (func:%s line:%4d):"fmt"", __func__, __LINE__,##args);\
        }\
    }while(0)

个人喜欢第一种风格

论坛徽章:
3
巳蛇
日期:2013-10-03 10:41:48申猴
日期:2014-07-29 16:12:04天蝎座
日期:2014-08-21 09:24:52
10 [报告]
发表于 2014-04-21 15:51 |只看该作者
应该是一个是c标准的变参宏,一个是gcc的变参宏
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP