2013-04-25 73 views
2
struct abc 
{ 
//some members 
}arrayOf[10]; 
struct def 
{ 
//some data memebers 
}obj; 

typedef void (*abc) (obj) 

我不確定陳述typedef void (*abc) (obj)意味着什麼。請認爲我是新手。c中的這個陳述是什麼意思?

+1

這是一個函數指針。 'abc'是一個類型,表示指向返回void並將obj作爲參數的函數的指針。 Google'C函數指針'用於更詳細和正確的描述。 – 2013-04-25 17:08:40

+1

http://stackoverflow.com/questions/89056/how-do-you-read-c-claclarations – minopret 2013-04-25 17:11:07

+5

這不應該編譯。你將'abc'聲明爲一個指向函數不返回的指針,並且接受一個類型爲'obj'的參數,這不是一個類型,所以應該抱怨。 – 2013-04-25 17:11:14

回答

2

它類型abc定義爲一個指針到接受稱爲objint類型的一個參數,並返回無(void)的功能。

+2

雖然這不是一個類型名稱,它不會讓你感到奇怪嗎?我很困惑。 – 2013-04-25 17:10:57

+0

你是對的 - 不知道是否會編譯。也許應該在struct之前有一個typedef? – 2013-04-25 17:11:58

+0

@MichaelDorgan:它會有什麼不同?在這個例子中'obj'仍然是一個變量名,而不是一個類型名。 – 2013-04-25 17:12:54

0

它引入一個新名稱abc作爲指向函數的指針的類型,該函數需要obj並返回void

返回類型(*名安康申報)(參數列表)

:類型指針到函數在聲明中以這種迂迴的方式總是指定

順便說一下,聲明中的*可能是不必要的。當你需要它們時,函數類型總是神奇地變成指針函數類型(比如數組類型奇蹟般地變成了指向元素的類型),並且你可以直接使用函數類型(而不是指針 - 函數類型)來聲明一個新函數。

正如其他人所指出的,您給出的上下文沒有名爲obj的類型,只有名爲obj的對象。如果此代碼編譯,則必須在其他位置定義另一種名爲obj的類型,在代碼中未給出。

8

即使忽略缺少的分號,也沒有任何意義;這是一個錯誤。

如果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被用於不同的目的(法律,但令人困惑)兩次。但沒有更多的上下文,不可能確定如何「修復」它。

這段代碼從哪裏來的?您是否確定您向我們顯示了確切的代碼?當你試圖編譯它時發生了什麼?

+0

+嚴重我很驚訝下一個答案投了,這實際上是錯誤的:O – 2013-04-25 17:19:20

+0

感謝您解決神奇! – 2013-04-25 17:23:23

+0

@VioletGiraffe:我不確定我解決了它。代碼不正確;我們仍然無法可靠地猜出它應該是什麼。 – 2013-04-25 17:24:47