2013-07-12 73 views
1

以下是對typedef修改的一些實驗,我無法理解2行和6行。爲什麼2和5會有不同的結果? 請給我一些澄清。Typedef更改行爲導致錯誤和警告

typedef long _long; 
extern _long tl;   //1 Fine...OK 
extern _long int tli; //2 extraneous `int' ignored...?? 
extern int _long til; //3 `_long' does not name a type...OK 
extern long l;   //4 Fine...OK 
extern long int li;  //5 Fine...OK 
extern int long il;  //6 Fine...?? 
+3

首先,不要使用具有前導下劃線的全局名稱,它們由規範保留。 –

+0

只是一句話:'long x;','long int x;'和'int long x;'都等價 –

+0

是的,我在這裏只是爲了方便閱讀。 –

回答

4

您試圖在某種程度上類似於宏使用typedef S,但是這不是他們的工作。

當你typedef long _long,表達_long int不會擴大到long int,它只是成爲一個編譯器錯誤,因爲longint成爲兩種類型的變量。

您可以將CV-資格這樣的類型,如用:

extern const _long foo; 

或者:

volatile _long bar; 

如果你想要的東西實際上是一個long int,你可以設置一個typedef爲:

typedef long int MyLongInt; 

此外,作爲一個旁觀,不要命名您的typedefs與領導下得分了。該標準保留了許多帶有下劃線的名稱。有關更多信息,請參閱this

+0

感謝您的解釋。 順便說一句,我用_long澄清和是的,它應該避免。感謝您的建議。 :) –

4

typedef關鍵字創建一個完整類型一個別名,而不是另一個關鍵字。

因此,例如,

extern _long int tli; 

大約是一樣的,你在做

extern long int int tli;