2016-08-01 70 views
0

C中的void (*xmlHashScanner)(void *payload, void *data, xmlChar *name)void *xmlHashScanner(void *payload, void *data, xmlChar *name)之間的區別是什麼?
他們爲什麼表現不同?void(* xmlHashScanner)和void * xmlHashScanner之間的區別


xmlHashScanner是庫libxml2中的用戶定義函數。
當我試圖重新定義這個函數有一點不同的原型:的void *xmlHashScanner代替void (*xmlHashScanner)我有以下錯誤:

error: ‘xmlHashScanner’ redeclared as different kind of symbol 
void *xmlHashScanner(void *payload, void *data, xmlChar *name) 
    ^
In file included from /usr/include/libxml2/libxml/parser.h:18:0, 
       from /home/solar/Bureau/parser/src/diam_dict.c:12: 
/usr/include/libxml2/libxml/hash.h:88:16: note: previous declaration of ‘xmlHashScanner’ was here 
typedef void (*xmlHashScanner)(void *payload, void *data, xmlChar *name); 

我不知道什麼是他們兩個人之間的區別。

+1

你能解釋不同的行爲? –

+0

@ScottHunter我說他們是不同的,因爲一個編譯而另一個不是。 – cheater

+0

'void(* xmlHashScanner)()'是一個指向void函數的指針。 'void * xmlHashScanner()'是一個返回void指針的函數。 – Arkadiy

回答

1
void (*xmlHashScanner)(void *payload, void *data, xmlChar *name) 

聲明xmlHashScanner作爲指向函數返回void,而

void *xmlHashScanner(void *payload, void *data, xmlChar *name) 

聲明xmlHashScanner作爲返回指向void的指針的函數。

在這兩個宣言和表達式語法,一元*操作符比後綴[]標和()函數調用操作符的優先級低,所以

T *a[N];  // a is an N-element array of pointer to T 
T (*a)[N]; // a is a pointer to an N-element array of T 
T *f();  // f is a function returning a pointer to T 
T (*f)(); // f is a pointer to a function returning T 
+0

我以爲我學到了很多關於c的知識,但現在我覺得我只是發現了它的0.1%......還有很長的路要走。 – cheater

+0

@cheater:請參閱C標準的[最新在線草案](http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf)第6.7節以獲得完整描述聲明語法。 6.7.6(申報人)是事情變得非常有趣的地方。 –

3

void (*xmlHashScanner)(...)爲函數指針返回無關(無效)而void *xmlHashScanner(...)原型爲函數原型返回一個void *

0

所以你比較這一點:

void *xmlHashScanner(void *payload, void *data, xmlChar *name); 

與此:

typedef void (*xmlHashScanner)(void *payload, void *data, xmlChar *name); 

第一個是函數聲明,第二個是typedef(定義了一個類型)。功能和類型是完全不同的東西;它們被用於不同的目的:

  • 函數可以調用
  • A類可用於製作一個變量,然後可以參與計算

這是你的編譯器是指什麼「一種不同的符號」 - 沒有上下文(除非偶然)這些代碼片段可以做類似的事情。例如,考慮一下代碼段 - 42&&。他們沒有什麼共同之處 - 他們是兩種不同的東西

要理解聲明的細節,這有點令人困惑,請使用right-left規則,該規則也執行here

  • typedef void (*xmlHashScanner)(whatever)意味着xmlHashScanner類型是一個指向與任何參數的函數返回void
  • void *xmlHashScanner(whatever)意味着xmlHashScanner是與任何參數的函數,該函數返回void *
相關問題