2010-08-30 52 views
9

我只是想检查编译器是否允许类型名称作为变量名称。 当我试图为什么字符串是允许的并且int int不被编译器允许?

int int; 

据报一个错误说

错误C2632: '诠释',然后 '廉政' 是非法的

但是当我试图

#include <string> 
using namespace std; 

int main() 
{ 
    string string; 
} 

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

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

编辑:包括更新。

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

int a(10); 

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

+0

你有什么包括? – 2010-08-30 14:33:59

+7

我会让有更多经验的人回答这个问题的标准答案,但实质上,'int'是一个关键字,而'string'是一个类。 – 2010-08-30 14:34:21

回答

22

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

和它的句法上罚款有类名和对象名相同。

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

注意:非常好,但任何维护者都会**杀死你,如果你真的这样做代码;)+1 – 2010-08-30 14:40:59

+2

这个答案是正确的,但我对“它的类名和对象名称是相同的”有问题。标准可能允许,但它是非常“不好”。 – 2010-08-30 14:42:39

+1

@Bill和John:同意。 – codaddict 2010-08-30 14:45:36

3

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

1

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

string只是一个“用户自定义”类(尽管这里定义的“用户”是C++标准承诺人)。但正因如此,“字符串”是而不是的一个关键字。

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

6

int是一个C++关键字。在第二个声明'string string'中声明了一个'std::string'类型的对象。在此之后的名称“串”在不合格查找

#include <string> 
using std::string; 

int main(){ 
    string string; 

    string s; // Error 
} 
+0

请注意,第一次使用('string string')仅在''为'#include''d且'使用命名空间标准;'存在于文件中时才有效。 – 2010-08-30 14:42:15

+0

@BillyONeal:或'使用std :: string' :) – ereOn 2010-08-30 14:46:58

+0

@ereOn:好点:) – 2010-08-30 14:48:06

0

好隐藏'std::string',因为别人已经基本公布了答案,我要继续前进,并张贴了我的意思......

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

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

0

编译器允许基本类型像模板一样表现类似行为 - 如果你不得不专门处理基元,那将是一场噩梦。

相关问题