博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用gdb理解C宏(#和##)
阅读量:5038 次
发布时间:2019-06-12

本文共 1812 字,大约阅读时间需要 6 分钟。

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

/* glibc-2.25/sysdeps/powerpc/powerpc64/sysdep.h */ 207 #define tostring(s) #s208 #define stringify(s) tostring(s)209 #define XGLUE(a,b) a##b210 #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' command10 macro undef -- Remove the definition of the C/C++ preprocessor macro with the given name11 ...
...12 (gdb) #13 (gdb) macro define tostring(s) #s14 (gdb) macro define stringify(s) tostring(s)15 (gdb) macro define XGLUE(a,b) a##b16 (gdb) macro define GLUE(a,b) XGLUE(a,b)17 (gdb) #18 (gdb) macro list19 macro define GLUE(a, b) XGLUE(a,b)20 macro define XGLUE(a, b) a##b21 macro define stringify(s) tostring(s)22 macro define tostring(s) #s23 (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, 45)30 expands to: 1234531 (gdb) macro expand GLUE("hello", "world")32 expands to: "hello""world"

由此可见,

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

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

另外,也可以用"gcc -E"查看宏展开。例如,

1 $ cat foo.S 2 #define SYS_ify(syscall_name)   __NR_##syscall_name 3 #define __NR_mmap               115 4 #define __NR_munmap             117 5  6 mov $SYS_ify(mmap), %eax 7 mov $SYS_ify(munmap), %eax 8  9 $ gcc -E foo.S | tail -210 mov $115, %eax11 mov $117, %eax12 $

转载于:https://www.cnblogs.com/idorax/p/6423222.html

你可能感兴趣的文章
iOS设计模式 - 中介者
查看>>
centos jdk 下载
查看>>
HDU 1028 Ignatius and the Princess III(母函数)
查看>>
关于多路复用器的综合结果
查看>>
(转)面向对象最核心的机制——动态绑定(多态)
查看>>
token简单的使用流程。
查看>>
django创建项目流程
查看>>
UIActionSheet 修改字体颜色
查看>>
Vue 框架-01- 入门篇 图文教程
查看>>
Spring注解之@Lazy注解,源码分析和总结
查看>>
spoj 345
查看>>
ios 设置屏幕方向的两种方法
查看>>
Java编程思想小笔记2
查看>>
正则表达式 之 常用实例
查看>>
【Pandas最好用的函数】
查看>>
Dynamics365解决方案的新特性
查看>>
预生成事件/生成后事件命令行对话框
查看>>
多变量微积分笔记24——空间线积分
查看>>
Magento CE使用Redis的配置过程
查看>>
poi操作oracle数据库导出excel文件
查看>>