我遇到了一个奇怪的问题,看起来像是Visual Studio 2008的问题。我有一个C结构体定义如下:
static struct frame {
short typupdt;
char callarg[1+CallSiz];
char *unitarg;
XTime unitage;
XTime orgtime;
XTime newtime;
char oldstat[1+StatSiz];
char newstat[1+StatSiz];
char incdisp[1+DispSiz];
char orgdisp[1+DispSiz];
char clearcod[1+ClearSiz];
char orgclear[1+ClearSiz];
char observd[1+ObsSiz];
char orgobs[1+ObsSiz];
char raddesc[1+Desc1Siz];
char incnum[INVIDLEN];
char agency[1+AgencySiz];
int wlins;
int wcols;
int skipsrch;
struct frame *next;
} *Frame= NULL;
应该是(似乎)创建了一个名为frame
的新struct
和一个全局指针(到这个文件)到那个struct
的一个叫做Frame
的示例。这一切看起来在代码本身中工作得很好。但是,当我调试这个代码并在某个地方设置断点,然后在监 windows 口中检查Frame
时,它报告的信息是完全错误的,就好像它正在查看正确的内存块,但是它对定义的理解是不正确的,也就是说,它说结构体拥有的字段甚至不接近。
一开始我以为是奇怪的命名空间问题,所以我改变了frame
和Frame
的名字,但是问题仍然存在。有人知道发生了什么吗?就像我说的,代码看起来可以工作,但是调试几乎是不可能的。
编辑:我用 * real * 定义更新了定义,下面是我在监 windows 口中看到的屏幕截图:
alt text http://img156.imageshack.us/img156/6943/watchlist.jpg
有人明白吗,我还是很困惑.
4条答案
按热度按时间t5zmwmid1#
Microsoft描述了您的情况:FIX: Wrong Type Definition Appears in Visual Studio .NET Debugger
解决方法:Microsoft强烈建议您使用唯一类型定义。通过使用唯一类型定义,可以避免对数据结构的真实值产生任何混淆。但是,如果无法使用唯一类型定义,也可以通过使用命名空间来避免此问题,如下面的示例代码所示:
然后调试器可以正确地解析类型定义。
mzsu5hc02#
问题是这个
将
bar
定义为foo*
,而不是foo
。请尝试而不是。
pkbketx93#
您是否正在运行调试版本?调试发布版本通常看起来会正常工作,但调试器会报告变量的垃圾值。
如果不是这样,那么我会尝试通过拆分定义来验证这是否是编译器/语法问题,这样您就可以将struct定义为typedef,然后在单独的语句中定义指针。(无论如何,这可以使代码更具可读性/可维护性-如果您不信任上面的代码,那么建议以您确实信任的方式重写它)
yws3nbqq4#
尝试声明
struct frame
并在不同的语句中定义该类型的变量。也许
static
会搞乱Visual Studio。