struct abc
{
//some members
}arrayOf[10];
struct def
{
//some data memebers
}obj;
typedef void (*abc) (obj)
我不確定陳述typedef void (*abc) (obj)
意味着什麼。請認爲我是新手。c中的這個陳述是什麼意思?
struct abc
{
//some members
}arrayOf[10];
struct def
{
//some data memebers
}obj;
typedef void (*abc) (obj)
我不確定陳述typedef void (*abc) (obj)
意味着什麼。請認爲我是新手。c中的這個陳述是什麼意思?
它類型abc
定義爲一個指針到接受稱爲obj
int
類型的一個參數,並返回無(void
)的功能。
雖然這不是一個類型名稱,它不會讓你感到奇怪嗎?我很困惑。 – 2013-04-25 17:10:57
你是對的 - 不知道是否會編譯。也許應該在struct之前有一個typedef? – 2013-04-25 17:11:58
@MichaelDorgan:它會有什麼不同?在這個例子中'obj'仍然是一個變量名,而不是一個類型名。 – 2013-04-25 17:12:54
它引入一個新名稱abc
作爲指向函數的指針的類型,該函數需要obj
並返回void
。
:類型指針到函數在聲明中以這種迂迴的方式總是指定返回類型
(*
名安康申報)(
參數列表)
順便說一下,聲明中的*
可能是不必要的。當你需要它們時,函數類型總是神奇地變成指針函數類型(比如數組類型奇蹟般地變成了指向元素的類型),並且你可以直接使用函數類型(而不是指針 - 函數類型)來聲明一個新函數。
正如其他人所指出的,您給出的上下文沒有名爲obj
的類型,只有名爲obj
的對象。如果此代碼編譯,則必須在其他位置定義另一種名爲obj
的類型,在代碼中未給出。
即使忽略缺少的分號,也沒有任何意義;這是一個錯誤。
如果obj
是一個類型的名字,它會定義abc
作爲類型void (*)(obj)
,即一個別名,作爲一個指針指向一個函數服用obj
類型的單個參數和返回void
。
但由於obj
是一個對象名稱,而不是一個類型名稱,這實際上並不意味着它。
當我用gcc編譯它,我得到一個警告:
warning: parameter names (without types) in function declaration
當我-pedantic-errors
編譯,警告變成了致命的錯誤。
的舊式(非原型)函數定義可以依法指定的名稱,而不是類型,參數:
void old_style_func(obj)
/* obj is implicitly of type int */
{
}
但這種形式不是有效的函數聲明。在聲明中,括號之間的單個標識符必須是類型名稱,而不是參數的名稱 - 這使聲明成爲原型。
gcc的錯誤信息意味着它試圖將它解釋爲它是舊式定義的開始,然後決定它是無效的,因爲它只是一個聲明。
底線是您應該密切關注編譯器警告。
我們可以推測什麼是打算。也許obj
本來是一個類型的名字,而這個:
struct def
{
//some data memebers
}obj;
應該是:
typedef struct def
{
// some data members
} obj;
或許類型名稱不小心被省略,並且最後一行應該是:
typedef void (*abc) (struct def obj);
雖然在這種情況下名稱obj
被用於不同的目的(法律,但令人困惑)兩次。但沒有更多的上下文,不可能確定如何「修復」它。
這段代碼從哪裏來的?您是否確定您向我們顯示了確切的代碼?當你試圖編譯它時發生了什麼?
+嚴重我很驚訝下一個答案投了,這實際上是錯誤的:O – 2013-04-25 17:19:20
感謝您解決神奇! – 2013-04-25 17:23:23
@VioletGiraffe:我不確定我解決了它。代碼不正確;我們仍然無法可靠地猜出它應該是什麼。 – 2013-04-25 17:24:47
這是一個函數指針。 'abc'是一個類型,表示指向返回void並將obj作爲參數的函數的指針。 Google'C函數指針'用於更詳細和正確的描述。 – 2013-04-25 17:08:40
http://stackoverflow.com/questions/89056/how-do-you-read-c-claclarations – minopret 2013-04-25 17:11:07
這不應該編譯。你將'abc'聲明爲一個指向函數不返回的指針,並且接受一個類型爲'obj'的參數,這不是一個類型,所以應該抱怨。 – 2013-04-25 17:11:14