我有一个奇怪的问题,几乎看起来像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;
应该(并且似乎)创建一个名为struct
的新frame
和一个名为struct
的{{1}}实例的全局指针(对此文件)。这一切似乎都在代码本身中运行良好。但是,当我调试此代码并在某处设置断点然后在监视窗口中检查Frame
时,它报告的信息是完全错误的。这就像它正在查看正确的内存,但它对定义的理解是不正确的,即它所说的结构所包含的字段甚至不是很接近。
起初我以为有一些奇怪的命名空间问题或其他什么,所以我更改了Frame
和frame
的名称,但问题仍然存在。有人知道发生了什么事吗?就像我说的,代码似乎有效,但调试几乎是不可能的。
编辑:我使用 real 定义更新了定义,这是我在观察窗口中看到的截图:
alt text http://img156.imageshack.us/img156/6943/watchlist.jpg
对任何人都嗤之以鼻?我仍然非常难过。
答案 0 :(得分:2)
Microsoft描述了您的情况: http://support.microsoft.com/kb/822551
替代方法:Microsoft强烈建议您使用唯一类型 定义
答案 1 :(得分:1)
问题是这个
struct foo { /*...*/ } * bar;
将bar
定义为foo*
,而不是foo
。试试
struct foo { /*...*/ } bar;
代替。
答案 2 :(得分:0)
您是否正在运行Debug构建?调试版本构建通常似乎有效,但调试器将报告变量的垃圾值。
如果不是这样,那么我会尝试通过拆分定义来验证它是否是编译器/语法问题,因此您将结构定义为typedef,然后在单独的语句中定义指针。 (无论如何,这可能会使代码更具可读性/可维护性 - 如果您不信任上述代码,那么以您认为可信的方式重写代码是可取的)
答案 3 :(得分:0)
尝试声明struct frame
并在不同的语句中定义该类型的变量。
struct frame {
/* .. Various other fields, etc */
struct frame *next;
};
static struct frame *Frame = NULL;
也许static
弄乱了Visual Studio。