首页 > 数据库技术 > 详细

用gdb理解C宏(#和##)

时间:2017-02-21 11:33:00      阅读:232      评论:0      收藏:0      [点我收藏+]

在Unix/Linux内核代码中,有两个C的宏被广泛使用。 例如:

/* glibc-2.25/sysdeps/powerpc/powerpc64/sysdep.h */ 
207 #define tostring(s) #s
208 #define stringify(s) tostring(s)
209 #define XGLUE(a,b) a##b
210 #define GLUE(a,b) XGLUE(a,b)

在gdb中用命令macro定义并展开看看,

 1 (gdb) help macro
 2 Prefix for commands dealing with C preprocessor macros.
 3 
 4 List of macro subcommands:
 5 
 6 macro define -- Define a new C/C++ preprocessor macro
 7 macro expand -- Fully expand any C/C++ preprocessor macro invocations in EXPRESSION
 8 macro expand-once -- Expand C/C++ preprocessor macro invocations appearing directly in EXPRESSION
 9 macro list -- List all the macros defined using the `macro define command
10 macro undef -- Remove the definition of the C/C++ preprocessor macro with the given name
11 ...<snip>...
12 (gdb) #
13 (gdb) macro define tostring(s)  #s
14 (gdb) macro define stringify(s) tostring(s)
15 (gdb) macro define XGLUE(a,b)   a##b
16 (gdb) macro define GLUE(a,b)    XGLUE(a,b)
17 (gdb) #
18 (gdb) macro list
19 macro define GLUE(a, b) XGLUE(a,b)
20 macro define XGLUE(a, b) a##b
21 macro define stringify(s) tostring(s)
22 macro define tostring(s) #s
23 (gdb) #
24 (gdb) macro expand tostring(12345)
25 expands to: "12345"
26 (gdb) macro expand tostring("hello")
27 expands to: "\"hello\""
28 (gdb) #
29 (gdb) macro expand GLUE(123, 456)
30 expands to: 123456
31 (gdb) macro expand GLUE("hello", "world")
32 expands to: "hello""world"

由此可见,

  • #是将单个宏参数转换成一个字符串
  • ##则是将两个宏参数连接在一起

可以简记为“单#字符串,双#连接参”。

用gdb理解C宏(#和##)

原文:http://www.cnblogs.com/idorax/p/6423222.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!