5

同样,将 32 位应用程序移植到 64 位。我在下面提到的 C_ASSERT 语句上收到负下标错误。


C_ASSERT (sizeof(somestruct) == some#define);

我还阅读了http://support.microsoft.com/kb/68475文章,但不确定在这种情况下我是否知道如何解决它。

帮助表示赞赏。

提前致谢。

4

1 回答 1

14

我猜C_ASSERT宏的定义是这样的:

#define C_ASSERT(x) typedef char C_ASSERT_ ## __COUNTER__ [(x) ? 1 : -1];

这是一个编译时断言:如果编译时表达式x为真,那么这将扩展为类似

typedef char C_ASSERT_1[1];

它将 typename 声明C_ASSERT_1为类型的别名char[1](数组 1 char)。相反,如果表达式x为假,则展开为

typedef char C_ASSERT_1[-1];

这是一个编译器错误,因为你不能有一个负大小的数组类型。

因此,您的问题是表达式sizeof(somestruct) == some#define是错误的,即大小somestruct不是您的代码所期望的。你需要解决这个问题——要么改变 的大小somestruct,要么改变 的值some#define,确保这不会破坏任何东西。

于 2009-09-26T21:53:08.793 回答