void (*)()是什么?该怎么处理
void (*)()是什么?
(void (*)())代表类型转换符,那
void (*)()怎么表示它?什么都不是?
------解决方案--------------------
void(*)()是一个返回值为void,参数为空的函数指针类型
void(*abc)();就是定义了一个“返回值为void,参数为空”的函数指针abc,可以这样调用:abc();
这一段能通过编译,最后一句,就是把def的类型强制转化成void(*)(),并赋给abc
------解决方案--------------------
函数名就是一个指针,void fun();
fun的类型就是void(*)();
------解决方案--------------------
说话之前 一定要先想好,否则容易传播错误的知识。
首先,(void (*)( )) 是一个类型名(type name),而且指定的是一个指针类型,又不是函数类型。
其次,那一对空的括号并不意味着参数为空。N1570,6.7.6.3 Function declarators (including prototypes):
The empty list in a function declarator that is not part of a definition of that function specifies that no information about the number or types of the parameters is supplied.
这就是说,如果在函数声明中使用空的参数列表,则意味着未提供参数的数量或类型信息,但并不是无参数。从C99开始,如果函数没有参数,建议使用(void)。
------解决方案--------------------
头回听说指针也有原型了。
------解决方案--------------------
头回听说还有什么“类型转换符”,你发明的?
------解决方案--------------------
你凭什么说它的参数为空?拿出你的权威出处来。对了,你如何用参数为空解释这个:
------解决方案--------------------
void (*)()函数地址,类型为void ()
------解决方案--------------------
什么你想引出什么,难道没有人告诉你,类型定义的本质是“将标识符定义为[color=#FF0000]它被声明的那种类型[/color]”吗?所以,类型定义的形式类似于声明。知道了这一点,你再研究一下如何声明一个函数类型,就明白了。
------解决方案--------------------
那不是“指向返回类型为void的函数”的指针么?
------解决方案--------------------
你老师教你的,和你从教材上看的,都是这样的声明:
他们没讲复杂一些的声明:
所以你的问题不在于不懂typedef,而在于不懂声明。
------解决方案--------------------
什么乱七八糟的。我前面说得很清楚,void(*)()是类型名。类型名的用处之一是强制类型转换:
(type-name )cast-expression
注意那个括号。ptr0和(ptr)0完全不是一回事嘛。
(void (*)())代表类型转换符,那
void (*)()怎么表示它?什么都不是?
------解决方案--------------------
void(*)()是一个返回值为void,参数为空的函数指针类型
void(*abc)();就是定义了一个“返回值为void,参数为空”的函数指针abc,可以这样调用:abc();
void * def;
void(*abc)();
abc=(void(*)())def;
这一段能通过编译,最后一句,就是把def的类型强制转化成void(*)(),并赋给abc
------解决方案--------------------
函数名就是一个指针,void fun();
fun的类型就是void(*)();
------解决方案--------------------
说话之前 一定要先想好,否则容易传播错误的知识。
首先,(void (*)( )) 是一个类型名(type name),而且指定的是一个指针类型,又不是函数类型。
其次,那一对空的括号并不意味着参数为空。N1570,6.7.6.3 Function declarators (including prototypes):
The empty list in a function declarator that is not part of a definition of that function specifies that no information about the number or types of the parameters is supplied.
这就是说,如果在函数声明中使用空的参数列表,则意味着未提供参数的数量或类型信息,但并不是无参数。从C99开始,如果函数没有参数,建议使用(void)。
int main (void)
{
void f();
f(2);
}
void f (int i)
{
printf("%d\n", i);
}
------解决方案--------------------
头回听说指针也有原型了。
------解决方案--------------------
头回听说还有什么“类型转换符”,你发明的?
------解决方案--------------------
void(*)()是一个返回值为void,参数为空的函数指针类型
void(*abc)();就是定义了一个“返回值为void,参数为空”的函数指针abc,可以这样调用:abc();void * def;
void(*abc)();
abc=(void(*)())def;
这一段能通过编译,最后一句,就是把def的类型强制转化成void(*)(),并赋给abc
你凭什么说它的参数为空?拿出你的权威出处来。对了,你如何用参数为空解释这个:
int main (void)
{
void f();
f(2);
}
void f (int i)
{
printf("%d\n", i);
}
------解决方案--------------------
void (*)()函数地址,类型为void ()
------解决方案--------------------
大家先看看我想引出的问题:
为什么
#define funcptr void (*)()不能表示为
typedef void (*)() funcptr;?????
因为我认为如果void(*)()是一种类型的话,上面的语句不应该出错才对
什么你想引出什么,难道没有人告诉你,类型定义的本质是“将标识符定义为[color=#FF0000]它被声明的那种类型[/color]”吗?所以,类型定义的形式类似于声明。知道了这一点,你再研究一下如何声明一个函数类型,就明白了。
------解决方案--------------------
那你说,(void(*)()) 0
这里的(void(*)())怎么表述?
那不是“指向返回类型为void的函数”的指针么?
------解决方案--------------------
typedef int Type; 我就是根据这个形式推断出:
typedef void(*)() Type;
上面的int和void(*)()不应该是相似的吗?
你老师教你的,和你从教材上看的,都是这样的声明:
int i;
struct s s1;
他们没讲复杂一些的声明:
int (*p) [2];
void (*p)(int,int);
所以你的问题不在于不懂typedef,而在于不懂声明。
------解决方案--------------------
那你说,(void(*)()) 0
这里的(void(*)())怎么表述?
那不是“指向返回类型为void的函数”的指针么?
照你这么说,(void(*)())就是某个指针,就暂且叫它为ptr吧,那么
ptr0是什么意思?
这个问题的来源是《C陷阱与缺陷》第二章的问题,完整语句如下:
(*void(*)())0();
什么乱七八糟的。我前面说得很清楚,void(*)()是类型名。类型名的用处之一是强制类型转换:
(type-name )cast-expression
注意那个括号。ptr0和(ptr)0完全不是一回事嘛。