【问题标题】:Are undeclared variables legal in C++?C++ 中未声明的变量是否合法?
【发布时间】:2014-11-15 20:23:11
【问题描述】:

我对@9​​87654321@ 完全感到困惑,我正在尝试编译。编译器给了我几十个“未声明的标识符”错误。它们似乎都是像这样的局部循环变量:

for ( i = 0; i < 100; i++ )

我可以轻松修复它,但我不明白该代码是如何为其他人编译的。而且这些文件已经很久没有被动过了。

VC++ 是否有某种编译器标志自动假定int 用于未声明的变量?我找不到它。什么给了?


复制问题的最小完整代码示例:

for ( int i = 0; i < 100; i++ );
for ( i = 0; i < 100; i++ );

【问题讨论】:

  • 这段代码打算用哪个编译器编译?某些较旧的不符合标准的编译器(尤其是 Visual Studio 6)的循环中声明的变量的范围会扩展到循环体之外,直到封闭块的末尾。所以你可以写for (int i = 0; i &lt; 10; ++i) {...} i = 42; 在你引用的那个文件中,变量iK首先在第1784行声明和使用,然后在循环体之后重用。
  • @IgorTandetnik - 我想你刚刚找到它......代码最初是用 VC7 编译的(不确定现在是哪个 Visual Studio)。我希望VS2013也能编译。
  • 尝试使用/Zc:forScope-构建
  • 我不认为/Zc:forScope 是正确的(见我的回答)。
  • @egrunin:我也不这么认为——而我建议的/Zc:forScope-(末尾有一个减号)很可能是。 Live example

标签: c++ visual-c++ undeclared-identifier


【解决方案1】:

问题与for 语句中声明的变量范围有关。该标准将此范围定义为仅限于for 循环本身。但是一些编译器支持用于将此范围扩展到封闭块的非标准遗留扩展。

要使用 MSVC 编译此类代码,请添加编译器开关 /Ze

详情请见MSDN docs。

下面的评论建议 /Zc:forScope,但根据 this MSDN page 这是不对的。

顺便说一句,G++ 有一个类似的-fno-for-scope 开关。

【讨论】:

  • 难以置信!就是这样 !示例的第 1784 行中的 for (int iK...)(在问题的 cmets 中)定义了 iK,并且该变量保持定义,直到从 1783 年开始到 1842 年结束的封闭结束。
  • 为了记录,G++ 有 -fno-for-scope 用于相同目的。在手册中,它们指的是“旧式代码”。它实际上是非常古老的风格,因为 Stroustrup 在 2000 年的“C++ 编程语言”版中已经解释过在 for 结束后变量不可见。
  • /Ze 是 considered deprecated,但是 /Zc:forScope-(注意减号!)成功了。谢谢! :)
【解决方案2】:

C++ 是一种类型化的语言。后果之一是您必须在使用变量之前声明它们。

这对许多人来说似乎很奇怪,但它有助于养成良好的编码习惯,而且当您在变量名称中输入拼写错误时也会给您带来错误。

一个易于理解的后果是,它可以帮助您通过检查参数的类型来调用重载函数的良好版本。此检查可以在编译时完成,从而提高运行时的性能。

这是从 C 继承的,C 是选择器到程序集,然后是 C++。分配变量就是在栈上分配内存空间。

您可以随时尝试查看 c++11 和 c++14 中的 auto 关键字,但在此之前请确保您知道类型是什么(就像是 1 之间的区别, 1.0 和 1.f)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-14
    • 1970-01-01
    • 1970-01-01
    • 2011-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多