C語言中typedef不能與儲存型別指示符同時用
C語言中,經常有如下的用法:
typedefstruct tag
{
...
} MyType, *MyPtr;
一旦通過如上定以後,就可以用MyType來定義struct tag結構了。
以前我使用typedef的時候,是按照其字面意思理解的,所以進入了一個誤區。比如說我想定義MyInt為int型別,我用的程式碼如下:
typedef MyInt int;
我把上述程式碼理解為:定義MyInt型別為int。一切好像都是順其自然的事情,但編譯的時候才知道錯誤。
其實,在C語言中宣告變數的時候,有個儲存型別指示符(storage-class-specifier),它包括我們熟悉的
extern
static
auto
register
在不指定儲存型別指示符的時候,編譯器會根據約定自動取預設值。另外,儲存型別指示符的位置也是任意的(但要求在變數名和指標*之前),也就是說以下幾行程式碼是等價的:
static const int i ;
const static int i ;
int const static i ;
const int static i ;
根據C語言規範,在進行句法分析的時候,typedef和儲存型別指示符是等價的!所以,我們把上述使用static的地方替換為typedef:
typedef const int i;
const typedef int i;
int const typedef i;
constint typedef i;
上述程式碼的語義是:將i定義為一個型別名,其等價的型別為const int。以後如果我們有i a;程式碼,就等價於const int a;
對於有指標的地方也是一樣的,比如:
int const typedef * t;
那麼程式碼
t p;
就相當於
int const *p;
另外,typedef不能和static等儲存型別指示符同時使用,因為每個變數只能有一種儲存型別,所以程式碼:
typedef static int i;
是非法的。
Trackback:http://tb.blog.csdn.net/TrackBack.aspx?PostId=626440