符号`M'在C/C++预处理器宏中没有定义。

6
为什么GDB在以下示例中不打印宏的值?
cat sample.c
#include <stdio.h>

#define M 42

int main(int argc, const char **argv)
{
  printf("M: %d\n", M);
  return 0;
}

❯ rm -f sample
❯ gcc -Wall -g3 -ggdb -gdwarf-2 sample.c -o sample
❯ gdb sample

gdb> break main
gdb> run
gdb> info macro M
  The symbol `M' has no definition as a C/C++ preprocessor macro
  at <user-defined>:-1
gdb> continue
  Continuing.
  M: 42

谢谢!

❯ gcc --version
Apple LLVM version 7.3.0 (clang-703.0.29)
❯ gdb --version
GNU gdb (GDB) 7.10.1

1
只是问一下,如果删除“-O2”会有什么区别吗? - Sourav Ghosh
@SouravGhosh 没有效果 =( - itsnikolay
1
在 [tag:c] 中应该是 int main(int argc, char **argv)argv 是可修改的,所以不要加上 const - Iharob Al Asimi
@iharob 谢谢,但仍然没有效果 =/ - itsnikolay
这个链接说GDB“可以评估包含宏调用的表达式”,“GDB使用当前列表位置范围内的宏”,但是您在main处中断,而不是在展开M的行上(在到达其使用之前可能会重新定义M)。 - Weather Vane
显示剩余2条评论
1个回答

2

使用GCC 4.4.7和GDB 7.2,我得到了与你所报告不同的结果。经过使用你提供的源代码和编译命令后,我的GDB会话如下:

> gdb sample

[ ... startup banner ... ]

(gdb) break main
Breakpoint 1 at 0x4004d3: file sample.c, line 7.
(gdb) run
Starting program: /home/jbolling/tmp/sample 

Breakpoint 1, main (argc=1, argv=0x7fffffffcba8) at sample.c:7
7     printf("M: %d\n", M);
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.166.el6_7.7.x86_64
(gdb) info macro M
Defined at /home/jbolling/tmp/sample.c:3
#define M 42
(gdb) continue
Continuing.
M: 42

Program exited normally.
(gdb) 

我猜想这里的关键区别,以及你没有看到M的定义的原因,在于GDB对于函数main中断点所关联的源代码位置的感知。你报告的GDB输出提供了一个线索:

gdb> info macro M
  The symbol `M' has no definition as a C/C++ preprocessor macro
  at <user-defined>:-1

特别注意GDB报告的位置:“<用户定义>”文件,行号-1。在我的GDB运行中,断点与main()体中的第一行源代码相关联。我倾向于相信,如果您在那里打断点,那么GDB将在该位置正确报告宏的定义。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接