我注意到以下代码编译了最近的编译器:
int main()
{
int x;
struct x;
x = 210; // ←
}
我记得几年前它没有编译。
是否在C ++ 11或C ++ 14中更改了查找规则,以使此代码“正常工作”(从而打破使用struct variable_name;
作为确保在以下代码中不使用该变量的方法) ?
更新:
显然我记得错了。我已经验证了即使使用Visual C ++ 2010也能编译好的代码。但是,当用于参数时,struct
名称位于内部范围内,并且阴影,如此代码中所示:
void foo( int x )
{
struct x;
x = 210; // ← Error
}
int main()
{
}
因此,我选择了“解决方案”,没有改变的答案;规则总是这样。
答案 0 :(得分:8)
[basic.scope.hiding] / 2 类名(9.1)或枚举名称(7.2)可以通过声明的变量,数据成员,函数或枚举器的名称隐藏相同的范围。如果类或枚举名称和变量,数据成员,函数或枚举器在同一作用域(按任何顺序)中声明具有相同名称,则类或枚举名称将隐藏在变量,数据成员,函数或枚举器名称可见。
这种语言自C ++ 98以来就已存在。如果您看到编译器工作方式不同,那么该编译器是预标准的,或者只是普通的错误。
答案 1 :(得分:0)
您所做的是struct x
的前瞻性声明。您没有声明名为x
的新变量。例如:
struct foo;
int foo;
struct foo {
int foo;
};
struct foo thisisfoovariable;
以上只是两个变量的声明:foo(类型int
)和thisisfoovariable,类型为struct foo
。