Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 结构名称不隐藏变量名称_C++_C++11_C++14 - Fatal编程技术网

C++ 结构名称不隐藏变量名称

C++ 结构名称不隐藏变量名称,c++,c++11,c++14,C++,C++11,C++14,我注意到以下代码是用最新的编译器编译的: int main() { int x; struct x; x = 210; // ← } 我记得几年前它还没有编译 是否在C++11或C++14中更改了查找规则以使此代码“正常工作”(从而中断了使用struct variable\u name;作为确保在以下代码中不使用该变量的手段) 更新: 显然我记错了。我已经验证了代码即使在Visual C++ 2010中也编译好了。但是,当用于参数时,

我注意到以下代码是用最新的编译器编译的:

int main()
{
    int x;
    struct x;
    x = 210;                  // ←
}
我记得几年前它还没有编译

是否在C++11或C++14中更改了查找规则以使此代码“正常工作”(从而中断了使用
struct variable\u name;
作为确保在以下代码中不使用该变量的手段)


更新: 显然我记错了。我已经验证了代码即使在Visual C++ 2010中也编译好了。但是,当用于参数时,
struct
名称位于内部范围内,阴影,如以下代码中所示:

void foo( int x )
{
    struct x;
    x = 210;                  // ← Error
}

int main()
{
}
因此,我选择了没有变化的答案作为“解决方案”;规则总是这样的

[basic.scope.hiding]/2类名(9.1)或枚举名(7.2)可以通过在同一范围内声明的变量、数据成员、函数或枚举数的名称隐藏。如果类或枚举名称以及变量、数据成员、函数或枚举数在同一作用域中以相同名称(以任何顺序)声明,则无论变量、数据成员、函数或枚举数名称在何处可见,该类或枚举名称都将隐藏

这种语言从C++98开始就存在了。如果您见过一个工作方式不同的编译器,那么该编译器是预标准的,或者只是简单的错误

[basic.scope.hiding]/2类名(9.1)或枚举名(7.2)可以通过在同一范围内声明的变量、数据成员、函数或枚举数的名称隐藏。如果类或枚举名称以及变量、数据成员、函数或枚举数在同一作用域中以相同名称(以任何顺序)声明,则无论变量、数据成员、函数或枚举数名称在何处可见,该类或枚举名称都将隐藏


这种语言从C++98开始就存在了。如果您见过一个工作方式不同的编译器,那么该编译器是预标准的,或者只是简单的错误。

您所做的是转发
struct x
的声明。您没有声明一个名为
x
的新变量。例如:

struct foo;
int foo;
struct foo {
    int foo;
};
struct foo thisisfoovariable;

上面只声明了两个变量:foo(类型为
int
)和thisisfoovariable,类型为
struct foo

,您所做的是转发
struct x
的声明。您没有声明一个名为
x
的新变量。例如:

struct foo;
int foo;
struct foo {
    int foo;
};
struct foo thisisfoovariable;

上面只声明了两个变量:foo(类型为
int
)和thisisfoovariable,类型为
struct foo

AFAIK变量名和类标记的作用域不同,因此可以在同一个范围内namespace@AngelusMortis:是的,问题涉及最后一句话中的作业。谢谢你指出模糊之处。修复。“我记得几年前它还没有编译。”你能给出一些我们可以检查的具体例子吗?编译器版本和标志?我不同意你的回忆。我不能让这不在科里鲁上编译,即使在GCC 4.6和C++ 98标准下,它似乎很乐意编译它:@ Lexness CraceSein轨道:唯一想到的是在C++休息室里的一个长的讨论,所以,涉及我,Johannes Schaub(LITB),我想小狗和好机器人,创建更“完美”且不合理复杂的宏版本,使用此技巧声明未使用的参数并确保其确实未使用。AFAIK变量名和类标记具有不同的作用域,因此可以在同一个范围内namespace@AngelusMortis:是的,问题涉及最后一句话中的作业。谢谢你指出模糊之处。修复。“我记得几年前它还没有编译。”你能给出一些我们可以检查的具体例子吗?编译器版本和标志?我不同意你的回忆。我不能让这不在科里鲁上编译,即使在GCC 4.6和C++ 98标准下,它似乎很乐意编译它:@ Lexness CraceSein轨道:唯一想到的是在C++休息室里的一个长的讨论,所以,涉及我,Johannes Schaub(LITB),我想小狗和好机器人,创建更“完美”且不合理复杂的宏版本,使用此技巧声明未使用的参数并确保其确实未使用。