【问题标题】:Visual Studio 9.0 Error C2051 Case Expression Not ConstantVisual Studio 9.0 错误 C2051 大小写表达式不恒定
【发布时间】:2012-07-12 22:56:37
【问题描述】:

当我尝试编译此代码时,我收到 Case Expression Not Constant 错误。我不知道为什么。

while ((*datalen) == 0)
    crReturn(NULL);  //error here
st->len = (st->len << 8) + **data;

函数crReturn()定义如下。

#define crReturn(z) \
do {\
    *crLine =__LINE__; return (z); case __LINE__:;\
} while (0)

【问题讨论】:

  • 这段代码是否在switch 语句中?如果不是,也许 MSVC++(令人困惑)在看到不在 switch 内的 case 时会给出 C2051 错误;我手头没有 MSVC++9 的副本,但您可以通过在代码中的某处粘贴随机的 case 0: 并查看从中得到什么错误来测试它。 (crReturn 的实际用途是什么?)
  • 哦。你在使用 Simon Tatham 的协程东西,不是吗?在那种情况下,我不禁认为你应该得到所有的痛苦:-)。您是否可能没有在函数的开头添加 crBegin; 并在末尾添加 crEnd;
  • 我注意到 Simon Tatham 的页面中关于他的协程宏的以下内容。 “请注意,Visual C++ 版本 6 不喜欢这种协程技巧,因为它的默认调试状态(用于编辑和继续的程序数据库)对 LINE 宏有一些奇怪的作用。”我不预计此问题会出现在更高版本的 MSVC++ 中,但您可以尝试关闭“编辑并继续”,看看是否有帮助。
  • @GarethMcCaughan 另外,这不是我的代码。这是 putty 的 svn 存储库的源代码。我正在尝试从 Visual Studio 9.0 构建 obj 文件并收到上述错误。我试图找出原因并克服它。
  • 该死的。我突然想到“禁用编辑并继续”可能是模棱两可的,所以让我明确一下我认为需要做什么:重要的是“调试信息格式”(在“C/C++ -> General”属性上页),它需要设置为“用于编辑和继续的程序数据库”以外的其他内容。如果这样做并重建没有帮助,那么我认为我没有想法;您可能想联系 Simon Tatham...

标签: visual-studio compiler-errors


【解决方案1】:

问题在于,当 MSVC++ 被配置为为其“编辑并继续”功能生成调试信息时,它做了一些非标准的事情(并且与它自己的文档相反),并且这种非标准破坏了 __LINE__ 在 Simon 中的使用方式Tatham 的协程宏。

PuTTY 源代码中的 cmets 对此有何评论:

In particular, if you are getting `case expression not constant'
errors when building with MS Visual Studio, this is because MS's
Edit and Continue debugging feature causes their compiler to
violate ANSI C. To disable Edit and Continue debugging:

- right-click ssh.c in the FileView
- click Settings
- select the C/C++ tab and the General category
- under `Debug info:', select anything _other_ than `Program
Database for Edit and Continue'.

所以你应该这样做。 (事实上​​,我知道你已经这样做了,因为在我发布这个答案之前我们在 cmets 中讨论过这个问题:-)。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-24
    • 1970-01-01
    • 2013-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-01
    • 2011-04-22
    相关资源
    最近更新 更多