1. 程式人生 > >C語言中typedef不能與儲存型別指示符同時用

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