如何修复错误c2118:负下标

Gen*_*too 4 c++ 64-bit win64 visual-c++

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


C_ASSERT (sizeof(somestruct) == some#define);
Run Code Online (Sandbox Code Playgroud)

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

感谢帮助.

提前致谢.

Ada*_*eld 11

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

#define C_ASSERT(x) typedef char C_ASSERT_ ## __COUNTER__ [(x) ? 1 : -1];
Run Code Online (Sandbox Code Playgroud)

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

typedef char C_ASSERT_1[1];
Run Code Online (Sandbox Code Playgroud)

它声明typename C_ASSERT_1是类型的别名char[1](数组为1 char).严格地说,如果表达式x为false,则扩展为

typedef char C_ASSERT_1[-1];
Run Code Online (Sandbox Code Playgroud)

这是编译器错误,因为您不能使用负数大小的数组类型.

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