如何修复错误c2118:负下标

时间:2009-09-25 20:24:51

标签: c++ visual-c++ 64-bit win64

再次,将32位应用程序移植到64位。我在下面提到的C_ASSERT语句中得到了负下标错误。


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

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

非常感谢帮助。

提前致谢。

1 个答案:

答案 0 :(得分:11)

我猜这个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为false,即somestruct的大小不是您的代码所期望的。您需要解决此问题 - 更改somestruct的大小,或更改some#define的值,确保不会破坏任何内容。