为什么Visual Studio不知道这个结构的正确定义?

时间:2009-10-15 20:35:43

标签: c visual-studio-2008 struct

我有一个奇怪的问题,几乎看起来像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时,它报告的信息是完全错误的。这就像它正在查看正确的内存,但它对定义的理解是不正确的,即它所说的结构所包含的字段甚至不是很接近。

起初我以为有一些奇怪的命名空间问题或其他什么,所以我更改了Frameframe的名称,但问题仍然存在。有人知道发生了什么事吗?就像我说的,代码似乎有效,但调试几乎是不可能的。

编辑:我使用 real 定义更新了定义,这是我在观察窗口中看到的截图:

alt text http://img156.imageshack.us/img156/6943/watchlist.jpg

对任何人都嗤之以鼻?我仍然非常难过。

4 个答案:

答案 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。