宏定义数值

alienyu0352 2015-11-03 11:00:36
有个关于宏定义的现象不知道怎么解释,不知道大家以前有没有见过

代码 宏定义:#define TK_ADD 62
#define TK_INTO 63

运行时宏的数值
(gdb) p TK_VARIABLE
$2 = 103
(gdb) p TK_ON
$3 = 60
(gdb) p TK_INDEX
$4 = 59
(gdb) p TK_ADD
$5 = 62
(gdb) p TK_INTO
$6 = 64
(gdb)


TK_INTO 开始往后的宏的数值都往后偏移了一位
...全文
188 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
lm_whales 2015-11-04
  • 打赏
  • 举报
回复
宏是可以被取消,并重新定义的 仅仅需要 #undef 就可以取消宏定义 取消后, #define 又可以重新定义 宏了 有些看不见的宏,是工程,或者开发环境定义的 makefile 和命令行,都可以定义宏 所以,不要认为 宏,只会有一个定义, 或者没看见#define,就是没定义
赵4老师 2015-11-03
  • 打赏
  • 举报
回复
引用 5 楼 fefe82 的回复:
把预编译的结果输出来看一下。 gcc 的话编译的时候加 -E -dD 。 看一下起作用的宏定义在哪里,定义成了什么。以及 case 的地方替换成了什么。 ================= 看看是不是漏写了 break;
理解讨论之前请先学会如何观察
fefe82 2015-11-03
  • 打赏
  • 举报
回复
把预编译的结果输出来看一下。 gcc 的话编译的时候加 -E -dD 。 看一下起作用的宏定义在哪里,定义成了什么。以及 case 的地方替换成了什么。 ================= 看看是不是漏写了 break;
alienyu0352 2015-11-03
  • 打赏
  • 举报
回复
引用 2 楼 fefe82 的回复:
这是 gdb 的问题,不是宏定义的问题。
其实不单单gdb看到的值是这样的,代码里面是一些switch case分支,运行出来也是这样。 比如说switch的数值是64,就会走到case TK_INTO分支。可是明明 #define TK_INTO 63;
alienyu0352 2015-11-03
  • 打赏
  • 举报
回复
引用 1 楼 lovesmiles 的回复:
宏不是在预编译时都被换掉了吗?编译时没有宏存在了,调试时还能输出宏?
编译的时候加上-gdwarf-2 -g3 就可以看到宏的调试信息
fefe82 2015-11-03
  • 打赏
  • 举报
回复
这是 gdb 的问题,不是宏定义的问题。
勤奋的小游侠 2015-11-03
  • 打赏
  • 举报
回复
宏不是在预编译时都被换掉了吗?编译时没有宏存在了,调试时还能输出宏?

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧