2017-07-19 105 views
1

使用的typedef如果我想聲明typedef某種類型,我會去像這樣的語法,在這個例子:函數指針用C

typedef int INT 

但是,當我想創造一個typedef一個功能,我期待下面的語法是一個:

typedef void (*)(int, char) myfunc; 

不是正確的一句是:

typedef void (*myfunc)(int, char); 

那麼爲什麼第一個不正確?

+0

看看[這個答案](https://stackoverflow.com/a/30345939/4265352)。它解釋瞭如何讀取C變量和類型聲明。 – axiac

+0

typedef是無關緊要的。這就是你如何定義類型的變量。 – StoryTeller

+1

@StoryTeller這不是一個完全重複的,它會詢問函數指針的聲明語法,而不是* typedef聲明。 –

回答

6

A typedef看起來完全像「正常」聲明。如果你聲明一個函數指針,它應該是這樣的:

void (*myfunc)(int, char); 

因此,typedef看起來是一樣的,與申報的標識符不參考類型的對象,唯一的區別,但是到了類型別名代替:

typedef void (*myfunc)(int, char); 

至於「?爲什麼」 - 好了,因爲語言就是這樣設計的,但我想,一旦你瞭解它瓦特orks,它可以說是最簡單的方法,不要爲typedef聲明引入不同的語法。這種設計遵循最少意外的原則,以不同的方式處理聲明將不必要的複雜。

+0

因此,規則不是如下: 如果我有一個稱爲類型的類型,我可以使用'typedef類型名稱'創建一個名爲Name的typedef。 但是,規則是: 如果有這樣的聲明_declarator name_我可以通過關鍵字'typedef'轉發delcarator的名稱爲typedef。 –

+0

@BiteBytes是的。 PeterJ的答案顯示了這適用於typedef'ing數組類型。 –

+2

@BiteBytes:在句法上,'typedef'被視爲像'auto'或'extern'這樣的存儲類說明符,即使它具有不同的含義。所以是的,'typedef'的形式是一個正則聲明的形式,只是在其前面加了'typedef'關鍵字。 –

0

的基本方法來創建函數指針是void (*myfunc)(int, char);

所以要創建一個新的類型,它是一個函數指針作爲參數是 typedef void (*myfunc)(int, char);

,這就是爲什麼它返回void,並得到intchar第一個是不正確的

function pointer之前不需要添加(*)

0

但是,當我想創造一個函數的類型定義,我期待 以下語法是一個:

typedef void (*)(int, char) myfunc;

當然你也可以寫你自己的編譯器你自己的語言。

但是C語法就是這樣。

下面是另一個例子:

typedef char foo[10];