2009-10-15 43 views
0

我有一个奇怪的问题,几乎看起来像一个Visual Studio 2008问题。我有一个C结构定义如下:为什么Visual Studio不知道这个结构的正确定义?

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; 

应该(而且似乎)创建一个新的名为structframe全局指针(此文件)到名为Framestruct的一个实例。这一切似乎在代码本身工作正常。但是,当我调试此代码并在某处设置了一个中断点,然后在监视窗口中检查Frame时,它报告的信息完全错误。这就像它正在查看正确的内存块,但是它对定义的理解是不正确的,即它所说的结构体所具有的字段并不是很接近。

起初我以为有些奇怪的命名空间问题或者其他东西,所以我改变了frameFrame的名字,但问题仍然存在。任何人都知道发生了什么事?就像我说的那样,代码似乎可行,但调试几乎是不可能的。

编辑:我更新了真正定义的定义,这里有我在监视窗口看到一个截图:

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

,使感舔任何人?我仍然非常难过。

+1

好吧,因为没有一个答案似乎有所帮助,所以您可能需要提供一个小的可编译示例来显示您遇到的错误,以便我们可以看到错误。 – sbi 2009-10-16 10:06:10

+0

肯定会发布一个显示问题的小例子 - 我用'struct frame'试了一下,我在调试器中添加了几个字段,并且没有显示'Frame'指向的内容的问题。 – 2009-10-16 14:34:07

+0

添加了原始定义以及当我在某个地方的文件中发生故障时在监视窗口中看到的内容。 – Morinar 2009-10-16 15:09:29

回答

2

有一些关于微软描述您的情况:http://support.microsoft.com/kb/822551

替代方法:Microsoft强烈建议您使用唯一的类型 定义。

+0

正如以上评论所详述的,这似乎是问题所在。绝对非常令人讨厌。 – Morinar 2009-10-16 15:42:09

+0

奇怪 - KB表示问题出在VS 2003中,它们有一个修补程序。看起来像在VS 2005或VS 2008中回归的问题。 – 2009-10-17 04:02:40

1

的问题是,这

struct foo { /*...*/ } * bar; 

限定bar是一个foo*,而不是一个foo。尝试

struct foo { /*...*/ } bar; 

改为。

+0

该文件中的其余代码假定“Frame”是指向“frame”的指针,而不是其自身的实例。如果我按照你的建议去做,那就不再是了。也不确定为什么这将是一个问题? – Morinar 2009-10-15 20:41:44

+0

如果您知道自己在做什么,这不是问题。例如,'sizeof(* bar)'会给你结构体的大小,但'sizeof(bar)'只能给你指针的大小。在具有8位'char'指针的32位机器上有4个字节,因此'sizeof(bar)== 4'。 – sbi 2009-10-15 20:59:34

0

您是否正在运行Debug版本?调试版本构建通常似乎可行,但调试器会报告变量的垃圾值。

如果不是这样,那么我会尝试通过拆分定义来验证它是否是编译器/语法问题,以便将结构定义为typedef,然后在单独的语句中定义指针。 (无论如何,这可以说使代码更具可读性/可维护性 - 如果您不信任上述代码,那么以您确信的方式重写它是可取的)

+0

我绝对是在调试(我从来没有编译过我们的应用程序的发布版本...整个其他团队做这些事情)。另外:关于拆分声明的好建议。我会尝试的。 – Morinar 2009-10-15 21:14:21

0

尝试声明struct frame并定义该类型的变量在不同的陈述。

struct frame { 
    /* .. Various other fields, etc */ 
    struct frame *next; 
}; 
static struct frame *Frame = NULL; 

也许static搞砸了Visual Studio。

+0

好主意(贾森建议也是),但只是尝试过,它仍然没有工作。在这里完全困惑。 – Morinar 2009-10-15 21:23:08

相关问题