C ++中的变量范围

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C ++中的变量范围相关的知识,希望对你有一定的参考价值。

如果我有以下代码:

for(int myvar = 0; myvar < 10; myvar++);
if(1)
{
    int var2 = 16;
}

然后,我写了以下内容:

myvar = 0;
var2 = 0;

这合法吗?我的VC ++ 6正确编译它,但我认为这应该是非法的。 (它在我的其他编译器中给出了编译器错误。)

答案

VC6相当陈旧,并不总是......严格......在标准的应用中:-)它实际上在某些情况下泄露了范围,例如:

for (int i = 0; i < 10; i++) { }
// You can still use 'i' here.

这导致一些funky macro magic解决这个问题。如果您使用的是符合ISO标准的编译器,那么您尝试执行的操作都是非法的。

从ISO C ++ 11 3.3.3/1开始,讨论使用{...}引入块作用域:

块中声明的名称是该块的本地名称;它有块范围。它的潜在范围从其声明点开始,并在其块结束时结束。

部分6.5.3涵盖了for语句“创建”的变量范围:

如果for-init-statement是声明,则声明的名称范围延伸到for-statement的末尾。

另一答案

不,它不会(§3.3.2本地范围):

  1. 块(6.3)中声明的名称是该块的本地名称。它的潜在范围从声明点(3.3.1)开始,到声明区域结束时结束。

我建议你使用过去十年发布的编译器。

另一答案

这应该是非法的,但VC6非常糟糕。

在Visual Studio 2005中,引入了一个名为“For-loop Scope中的强制一致性”的新项目级设置。这解决了这个问题并提供了向后兼容性。这意味着较旧的代码库可以通过禁用此设置在较新版本的visual studio中进行编译。

然而,MS在VS2005中做的一件事是默认打开它,因此更接近标准。

另一答案

这合法吗?我的VC ++ 6正确编译它,但我认为这应该是非法的。

不,它不应该是合法的。转储VC ++ 6。使用新的更好的编译器。

另一答案

VC花了大约十年的时间来为循环和条件语句中声明的变量实现适当的范围。一般来说,你不能依赖VC6对C ++的判断。

以上是关于C ++中的变量范围的主要内容,如果未能解决你的问题,请参考以下文章

为啥 dolphindb 脚本中的函数无法访问外部范围内的变量

全局变量的顺序改变了 C++/OpenGL 中的性能

C程序存储结构

C语言中,宏替换与定义全局变量的区别是啥?

C++11的for循环,以及范围Range类的实现

C/C++中作用域详解(转)