为什么可以访问范围之外的枚举器?

Why can you access enumerators outside the scope?

本文关键字:枚举 访问 范围 为什么      更新时间:2023-10-16

为什么可以访问范围之外的枚举器,而不能直接访问结构的成员?通过范围,我的意思是声明范围 - 如果我错了,请纠正我。

举个例子: 您可以这样做:

enum colors {red, blue, white};
int color = red;

但你不能这样做:

struct colors {red, blue, white};
int color = red;

谢谢!

好吧,好吧,正如另一条评论所说,这是因为这就是C++的工作方式。

回到过去,我们用类似的东西模拟了这样的东西

class Colors {
public:
static int RED = 0;
static int GREEN = 1;
static int YELLOW = 2;
}

然后添加了枚举,因此您无需编写Colors.RED。它本质上是句法糖。

更新

作用域只是程序中名称可见的部分。规则可以是简单的,复杂的或奇怪的:C++复杂,JavaSccript则奇怪。你可以在这里和这里看到冗长的解释,但这里有一个基本的概念。

在 C++ 中,这是一种源自 Algol 60 的块结构语言,在声明它的块中定义了一个名称。一种块是文件。如果在文件顶部声明名称,则会在声明之后的文件中的任何位置定义该名称。

另一种块由一对大括号{}定义。 在大括号内声明的任何内容都是从声明到封闭的结束大括号定义的。 所以

#include <stdlib>  // copies a bunch of code into the file
int foo = 0;       // declared here, visible to end.
int fn(){
int bar = 2 ;
if(bar == 2){
foo = bar;
cout << bar << nl;  // gives '2'
cout << foo << nl;  // still gives '2'
}
cout << foo << nl ;  // gives '0'
cout << bar << nl ;  // compile time error 'bar' not defined
}

为什么?内foo隐藏了外foo,所以这就是打印在if块内的那个。bar定义在if块的顶部,因此在大括号结束if块后,它不再可见("不再在范围内")

还有更多的规则,但我建议在其中一个链接或一本好的C++书中阅读它。

没有范围可以超出。enum不会像struct那样引入新的范围。为什么?好吧,为什么不呢。它们是两个完全不同的东西,所以期望一个与另一个相同是空洞的。

然而,enum class确实以这种方式工作;该功能恰如其分地称为"作用域枚举"。