我只是想检查编译器是否允许类型名称作为变量名称。 我试过的时候
int int;
报告错误
错误C2632:'int'后跟'int'是非法的
但是当我尝试
时#include <string>
using namespace std;
int main()
{
string string;
}
它没有给出任何错误。
string
和int
都是数据类型。
为什么编译器允许string
并且不允许int
?
编辑:包括更新。
编辑:有些人说int不是一个类。 在这种情况下,为什么允许以下行。int a(10);
它的作用类似于类的构造函数。
答案 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>