2010-08-30 50 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

編譯器允許基本類型像模板一樣表現類似行爲 - 如果你不得不專門處理基元,那將是一場噩夢。

相關問題