繁体   English   中英

为什么编译器允许这样做?

[英]Why does the compiler allow this?

以下将成功编译:

struct XX {
  int element;
};

int main ()
{
  XX  XX, prev_XX  ;
  prev_XX = XX;
  XX = prev_XX;  //  ??? NO error: expected unqualified-id before '=' token
}

编译器如何知道它是类型还是变量?

编辑:

出现此错误:(来自sftrabbit的示例)

int main ()
{
    XX XX, prev_XX;
    XX XX2; // error: expected ';' before 'XX2'
}

变量名称隐藏了结构名称(第3.3.10节):

可以通过在嵌套的声明性区域或派生类(10.2)中使用相同名称的显式声明来隐藏名称。

如果需要具体引用结构名称,则需要使用详细的类型说明符struct XX (第3.4.4节):

即使该名称已被非类型声明(3.3.10)隐藏,也可以使用精致的类型说明符(7.1.6.3)来引用先前声明的类名或枚举名。

因此,编译器知道XX在这里引用了变量,因为这就是它可以对应的全部。 它甚至不会考虑它引用该结构的可能性。 实际上,让我们看看如果尝试将其用作类型会发生什么:

struct XX {
    int elemnent;
};

int main ()
{
    XX XX, prev_XX;
    XX XX2; // Can we continue to use XX as a type?
}

我们实际上得到一个错误:

error: expected ‘;’ before ‘XX2’

因此,我们必须执行struct XX XX2; ,没有任何错误。

这是由于表达式的语法。

就像某些单词可以是名词或动词一样-取决于句子中的位置

对象的名称隐藏了结构的名称。 如果要指定结构,则应使用详细名称

XX XX;
struct XX YY;

它是在C ++中引入的,因为在C中结构名称和变量名称属于不同的名称空间,因为在C中必须始终使用结构指定关键字struct。 在C ++中,允许使用不带关键字struct的结构名,但是如果变量名重叠,则它们将隐藏结构名。

这是追溯到C时代的一个微妙问题。

当您声明XX XX; 第二个XX (变量)遮盖了第一个XX (类型)。 您仍然可以使用struct XX命名该类型。

struct XX {};

int main() {
    XX XX;

    XX other; // error: expected ‘;’ before ‘other’

    struct XX another; // OK

    another = XX; // OK

    return 0;
}

您可以在这里查看

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM