我有一个C文件(* sample.c *):
#include <stdio.h>
#define M 42
#define ADD(x) (M + x)
int main ()
{
printf("%d\n", M);
printf("%d\n", ADD(2));
return 0;
}
我用以下代码编译:
gcc -O0 -Wall -g3 sample.c -o sample
然后使用
gdb ./sample
输出量:
GNU gdb (Gentoo 7.3.1 p2) 7.3.1
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-pc-linux-gnu".
For bug reporting instructions, please see:
<http://bugs.gentoo.org/>...
Reading symbols from /tmp/sample...done.
(gdb) macro list
(gdb) macro expand ADD(2)
expands to: ADD(2)
(gdb) print M
No symbol "M" in current context.
(gdb) q
这曾经是工作的。我需要这个工作,因为我正在使用的库 *#定义 * 名称的硬件外设和内存地址。
这似乎与on the Sourceware GDB site)所示的行为直接矛盾。
我做错了什么?
4条答案
按热度按时间ddrv8njm1#
看起来宏需要以这样或那样的方式“纳入范围”。如果你完全按照你链接到的页面中的示例操作,它们就会像广告上说的那样工作(至少对我来说是这样)。
示例(
t.c
是源文件):或者:
oxosxuxt2#
首先尝试执行
list
:v1l68za43#
我得到了示例问题,并意识到我使用的是GCC的旧版本。
以前我用的是GCC 3.46和GDB 7.3,宏扩展不起作用,升级GCC到4.5.2和GDB到7.5解决了这个问题。
yzxexxkh4#
GDB只在预处理时替换所有宏的可执行文件上工作,因此 M 不存在于上下文中。