【问题标题】:C++ does not recognize string as keywordC++ 不将字符串识别为关键字
【发布时间】:2021-04-28 16:19:42
【问题描述】:

我尝试了以下代码:

#include <iostream>
using namespace std;
int main()
{ 
     char string[4]='xyz';  
     return 0;
}

由于字符串是关键字,编译器应该给出错误但运行良好。谁能解释为什么它编译成功。

【问题讨论】:

  • string 不是关键字。
  • string 不是关键字,它只是std 命名空间中的标识符。您已经创建了一个新标识符 string,它位于您的 main 函数的本地。
  • 另外我假设你的意思是"xyz" 不是'xyz'
  • 此外,虽然&lt;iostream&gt; 可能 包括&lt;string&gt;,但不能保证或在任何地方指定。如果您想使用std::string,您应该始终明确地包含&lt;string&gt; 标头。
  • @AndreasWenzel -- 很好的建议,但请注意,阴影适用于所有名称,而不仅仅是变量的名称。在这种情况下,变量 string 的名称隐藏了 string 类型的全局名称(因为,你知道,using namespace std)。

标签: c++ string exception keyword


【解决方案1】:

string 不是关键字。

它是标准库中声明的类型的名称。

当你给它一个名字时,你正在做一种叫做阴影的事情。这在下面的例子中更清楚:

{
    int x = 0;
    
    {
        int x = 5;
        std::cout << x << std::endl;
    }
    
    std::cout << x << std::endl;
}

打印什么?

嗯,首先是5,然后是0

这是因为第二个作用域中的 x 覆盖了第一个作用域中的 x。它“遮蔽”了第一个声明。

这也适用于类型名:

struct MyStruct {
    int x;
};

...

{
    ...
    int MyStruct = 10;
    ...
}

在这里,MyStruct 在该范围内被覆盖。

在您使用std::string 的示例中也发生了同样的事情

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-20
    • 2015-07-28
    • 1970-01-01
    • 1970-01-01
    • 2016-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多