C++ C++;无法将字符串识别为关键字

C++ C++;无法将字符串识别为关键字,c++,string,exception,keyword,C++,String,Exception,Keyword,我尝试了以下代码: #include <iostream> using namespace std; int main() { char string[4]='xyz'; return 0; } #包括 使用名称空间std; int main() { 字符字符串[4]='xyz'; 返回0; } 由于字符串是一个关键字,编译器应该给出错误,但运行正常。有人能解释为什么它能成功编译。string不是关键字 它是标准库中声明的类型的名称 当你给它命名时,你

我尝试了以下代码:

#include <iostream>
using namespace std;
int main()
{ 
     char string[4]='xyz';  
     return 0;
}
#包括
使用名称空间std;
int main()
{ 
字符字符串[4]='xyz';
返回0;
}

由于字符串是一个关键字,编译器应该给出错误,但运行正常。有人能解释为什么它能成功编译。

string
不是关键字

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

当你给它命名时,你在做一件叫做阴影的事情。下面的示例更清楚地说明了这一点:

{
    int x = 0;
    
    {
        int x = 5;
        std::cout << x << std::endl;
    }
    
    std::cout << x << std::endl;
}
在这里,MyStruct在该范围内被重写


在您的示例中,
std::string
string
不是关键字时也会发生同样的情况

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

当你给它命名时,你在做一件叫做阴影的事情。下面的示例更清楚地说明了这一点:

{
    int x = 0;
    
    {
        int x = 5;
        std::cout << x << std::endl;
    }
    
    std::cout << x << std::endl;
}
在这里,MyStruct在该范围内被重写


在您的示例中,
std::string

string
不是关键字。
string
不是关键字,它只是
std
命名空间中的标识符。您已经创建了一个新的标识符
字符串
,它是主函数的本地标识符。另外,我假定您的意思是
“xyz”
而不是
“xyz”
。此外,虽然
可能包含
,但它在任何地方都不能保证或指定。如果要使用
std::string
,则应始终显式包含
标题。@AndreasWenzel——这是一个很好的建议,但请注意阴影应用于所有名称,而不仅仅是变量名称。在这种情况下,变量
string
的名称会隐藏类型
string
的全局名称
string
不是关键字。
string
不是关键字,它只是
std
命名空间中的标识符。您已经创建了一个新的标识符
字符串
,它是主函数的本地标识符。另外,我假定您的意思是
“xyz”
而不是
“xyz”
。此外,虽然
可能包含
,但它在任何地方都不能保证或指定。如果要使用
std::string
,则应始终显式包含
标题。@AndreasWenzel——这是一个很好的建议,但请注意阴影应用于所有名称,而不仅仅是变量名称。在这种情况下,变量
string
的名称会隐藏类型
string
的全局名称(因为您知道,
使用名称空间std
)。