2016-08-01 66 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 *
相关问题