为什么允许字符串字符串并且编译器不允许使用int int?

时间:2010-08-30 14:32:21

标签: c++ types

我只是想检查编译器是否允许类型名称作为变量名称。 我试过的时候

int int;

报告错误

  

错误C2632:'int'后跟'int'是非法的

但是当我尝试

#include <string>
using namespace std;

int main()
{
    string string;
}

它没有给出任何错误。 stringint都是数据类型。

为什么编译器允许string并且不允许int

编辑:包括更新。

编辑:有些人说int不是一个类。 在这种情况下,为什么允许以下行。

int a(10);

它的作用类似于类的构造函数。

7 个答案:

答案 0 :(得分:22)

string不是C++ reserved word,但int是,且保留字不能用作标识符。

它的语法很好,让类名和对象名相同。

class test {}; 
int main() { 
        test test; // test is an object of type test.
} 

答案 1 :(得分:6)

int是一个C ++关键字。在第二个声明中,'string string'声明了一个'std::string'类型的对象。在此之后,名称“string”将'std::string'隐藏在非限定查询

#include <string>
using std::string;

int main(){
    string string;

    string s;  // Error
}

答案 2 :(得分:3)

int是关键字,而string是标准库中类的名称,但不是关键字。

答案 3 :(得分:1)

string实际上并不是int具有相同意义的“数据类型”。 int是“本机类型”,因此,文本“int”是关键字。

string只是一个“用户定义的”类(尽管这里定义的是“用户”,它是C ++标准委员会)。但同样,“string”不是关键字。

所以int int是两个关键字,但string string只是定义一个名为“string”的可变字符串“string”。 C ++编译器可以直接保持“字符串”的单独两种用法(但这样做并不是一个好主意,因为正如您所演示的那样,程序员通常不能这样做。)

答案 4 :(得分:0)

好吧,鉴于其他人已经基本上发布了答案,我将继续发布我的意思......

我假设因为第二个答案编译,你的文件中有using namespace std;(这通常不是一个好主意;我不明白为什么人们会告诉开始的C ++用户这样做)。

当编译器解析第一个string时,它能够在命名空间std中找到该类。第二次使用string只是变量的名称。

答案 5 :(得分:0)

编译器允许基本类型的行为类似于模板的目的 - 如果你不得不专门处理各地的基元,那将是一场噩梦。

答案 6 :(得分:0)

尝试删除

#include <string>