符号“M”没有定义为 C/C++ 预处理器宏

its*_*lay 6 c gcc gdb clang

为什么 GDB 在以下示例中不打印宏的值?

\n\n
\xe2\x9d\xaf cat sample.c\n#include <stdio.h>\n\n#define M 42\n\nint main(int argc, const char **argv)\n{\n  printf("M: %d\\n", M);\n  return 0;\n}\n\n\xe2\x9d\xaf rm -f sample\n\xe2\x9d\xaf gcc -Wall -g3 -ggdb -gdwarf-2 sample.c -o sample\n\xe2\x9d\xaf gdb sample\n\ngdb> break main\ngdb> run\ngdb> info macro M\n  The symbol `M\' has no definition as a C/C++ preprocessor macro\n  at <user-defined>:-1\ngdb> continue\n  Continuing.\n  M: 42\n
Run Code Online (Sandbox Code Playgroud)\n\n

谢谢!

\n\n
\xe2\x9d\xaf gcc --version\nApple LLVM version 7.3.0 (clang-703.0.29)\n\xe2\x9d\xaf gdb --version\nGNU gdb (GDB) 7.10.1\n
Run Code Online (Sandbox Code Playgroud)\n

Joh*_*ger 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) 
Run Code Online (Sandbox Code Playgroud)

我怀疑这里的关键区别以及您没有看到 的定义的原因M在于 GDB 对与函数 处的断点关联的源位置的理解main。您报告的 GDB 输出提供了有关此问题的线索:

gdb> info macro M
  The symbol `M' has no definition as a C/C++ preprocessor macro
  at <user-defined>:-1
Run Code Online (Sandbox Code Playgroud)

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