C语言 为什么Visual Studio不知道此结构的正确定义?

ie3xauqp  于 2023-01-25  发布在  其他
关注(0)|答案(4)|浏览(174)

我遇到了一个奇怪的问题,看起来像是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时,它报告的信息是完全错误的,就好像它正在查看正确的内存块,但是它对定义的理解是不正确的,也就是说,它说结构体拥有的字段甚至不接近。
一开始我以为是奇怪的命名空间问题,所以我改变了frameFrame的名字,但是问题仍然存在。有人知道发生了什么吗?就像我说的,代码看起来可以工作,但是调试几乎是不可能的。
编辑:我用 * real * 定义更新了定义,下面是我在监 windows 口中看到的屏幕截图:
alt text http://img156.imageshack.us/img156/6943/watchlist.jpg
有人明白吗,我还是很困惑.

t5zmwmid

t5zmwmid1#

Microsoft描述了您的情况:FIX: Wrong Type Definition Appears in Visual Studio .NET Debugger

解决方法:Microsoft强烈建议您使用唯一类型定义。通过使用唯一类型定义,可以避免对数据结构的真实值产生任何混淆。但是,如果无法使用唯一类型定义,也可以通过使用命名空间来避免此问题,如下面的示例代码所示:

namespace MyNamespace {
struct IDENTICALSTRUCT {
...;
};

using namespace MyNamespace;

然后调试器可以正确地解析类型定义。

mzsu5hc0

mzsu5hc02#

问题是这个

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

bar定义为foo*,而不是foo。请尝试

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

而不是。

pkbketx9

pkbketx93#

您是否正在运行调试版本?调试发布版本通常看起来会正常工作,但调试器会报告变量的垃圾值。
如果不是这样,那么我会尝试通过拆分定义来验证这是否是编译器/语法问题,这样您就可以将struct定义为typedef,然后在单独的语句中定义指针。(无论如何,这可以使代码更具可读性/可维护性-如果您不信任上面的代码,那么建议以您确实信任的方式重写它)

yws3nbqq

yws3nbqq4#

尝试声明struct frame并在不同的语句中定义该类型的变量。

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

也许static会搞乱Visual Studio。

相关问题