【问题标题】:how to fix the error c2118: negative subscript如何修复错误c2118:负下标
【发布时间】:2009-09-25 20:24:50
【问题描述】:

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


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

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

感谢您的帮助。

提前致谢。

【问题讨论】:

  • 什么是C_ASSERT?如果它是某种静态断言,那么这个错误只会表明断言失败。这是一种比较常见的实现静态断言的方式,如果条件为假,则会导致负下标错误。

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


【解决方案1】:

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

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

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

typedef char C_ASSERT_1[1];

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

typedef char C_ASSERT_1[-1];

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

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

【讨论】:

  • 是的..没错。结构的大小与 #define 值不匹配,因为结构有几个指针,并且 64 位编译改变了结构的大小。不过谢谢,我在周日深夜想通了,现在可以编译了。
猜你喜欢
  • 2022-01-16
  • 1970-01-01
  • 2015-09-24
  • 2013-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-11
  • 1970-01-01
相关资源
最近更新 更多