有人能解释一下原因吗;无效函数(void(*)(int)funcptr)&引用;是非法的

有人能解释一下原因吗;无效函数(void(*)(int)funcptr)&引用;是非法的,c,function-pointers,function-declaration,C,Function Pointers,Function Declaration,当声明以函数指针作为参数的函数时,编译器会抛出错误 void func_dec(int x, void(*)() funcptr); 鉴于其接受以下声明 void func_dec(int x, void(*funcptr)()); void func_dec(int , void(*) ()); 为什么编译器不能识别前一个声明,尽管它看起来合乎逻辑 这是因为 void(*)() funcptr 本身的语法无效 只需在编写函数声明时提供类型 void func_dec(int x

当声明以函数指针作为参数的函数时,编译器会抛出错误

 void func_dec(int x, void(*)() funcptr);
鉴于其接受以下声明

 void func_dec(int x, void(*funcptr)());
void func_dec(int , void(*) ());
为什么编译器不能识别前一个声明,尽管它看起来合乎逻辑

这是因为

 void(*)() funcptr
本身的语法无效

只需在编写函数声明时提供类型

 void func_dec(int x, void(*funcptr)());
void func_dec(int , void(*) ());
应该足够了。否则,如果还要指定变量名,请编写

 void func_dec(int x, void(*funcptr) ());
因为,

 void(*)() funcptr
本身的语法无效

只需在编写函数声明时提供类型

 void func_dec(int x, void(*funcptr)());
void func_dec(int , void(*) ());
应该足够了。否则,如果还要指定变量名,请编写

 void func_dec(int x, void(*funcptr) ());

函数参数名应与声明函数时函数名的位置相同

功能声明:

void func();  // correct syntax
void() func;  // incorrrect syntax
void (*func_ptr)();  // correct syntax
void (*)() func_ptr; // incorrect syntax
函数指针声明:

void func();  // correct syntax
void() func;  // incorrrect syntax
void (*func_ptr)();  // correct syntax
void (*)() func_ptr; // incorrect syntax
如果使用以下技巧,声明函数指针将变得更容易:

以函数声明为例。将函数名替换为
(*pointerName)
,如果需要未命名的版本,则替换为
(*)

例如:

 int func1(char* parm1);        // function
 int (*func1_ptr)(char* parm1); // function pointer

 // function taking a function pointer as parameter:
 void foo(int (*func1_ptr)(char*));
 // The same declaration with an unnamed parameter:
 void foo(int (*)(char*));

函数参数名应与声明函数时函数名的位置相同

功能声明:

void func();  // correct syntax
void() func;  // incorrrect syntax
void (*func_ptr)();  // correct syntax
void (*)() func_ptr; // incorrect syntax
函数指针声明:

void func();  // correct syntax
void() func;  // incorrrect syntax
void (*func_ptr)();  // correct syntax
void (*)() func_ptr; // incorrect syntax
如果使用以下技巧,声明函数指针将变得更容易:

以函数声明为例。将函数名替换为
(*pointerName)
,如果需要未命名的版本,则替换为
(*)

例如:

 int func1(char* parm1);        // function
 int (*func1_ptr)(char* parm1); // function pointer

 // function taking a function pointer as parameter:
 void foo(int (*func1_ptr)(char*));
 // The same declaration with an unnamed parameter:
 void foo(int (*)(char*));

这是非法的,因为语言标准中的正式定义是这样说的。至于为什么会是这样,而且可能看起来很模糊,这里是:

发件人:

此语法的目的是使标识符的声明符具有 与中该标识符的实例具有相同的视觉外观 表情。例如,在:

int x[3],*y,z(无效)

字符(*f(int))[]

标识符x可能以索引形式出现在源中 数组,y作为取消引用的指针,z作为函数调用。一 使用调用f的结果的表达式示例如下 (*f(42))[1]

与此相同:

因此,

整数i,*pi,**ppi

声明一个整数,一个指向整数的指针,一个 指向整数指针的指针。这些声明的语法 反映了i、*pi和**ppi都产生int类型的观察结果 在表达式中使用时。同样地

intf(),*f(),(*f)()

申报 一个返回整数的函数,一个返回指向 整数,指向返回整数的函数的指针

int*api[10],(*pai[10]

声明指向整数的指针数组和指向 整数数组。在所有这些情况下,变量的声明 类似于其在表达式中的用法,该表达式的类型为 宣言的首脑


这是非法的,因为语言标准中的正式定义是这样说的。至于为什么会是这样,而且可能看起来很模糊,这里是:

发件人:

此语法的目的是使标识符的声明符具有 与中该标识符的实例具有相同的视觉外观 表情。例如,在:

int x[3],*y,z(无效)

字符(*f(int))[]

标识符x可能以索引形式出现在源中 数组,y作为取消引用的指针,z作为函数调用。一 使用调用f的结果的表达式示例如下 (*f(42))[1]

与此相同:

因此,

整数i,*pi,**ppi

声明一个整数,一个指向整数的指针,一个 指向整数指针的指针。这些声明的语法 反映了i、*pi和**ppi都产生int类型的观察结果 在表达式中使用时。同样地

intf(),*f(),(*f)()

申报 一个返回整数的函数,一个返回指向 整数,指向返回整数的函数的指针

int*api[10],(*pai[10]

声明指向整数的指针数组和指向 整数数组。在所有这些情况下,变量的声明 类似于其在类型为的表达式中的用法 宣言的首脑


因为这不是语法中指定的语法。在用C语言声明函数时,强烈建议您了解工作语法的确切含义。如果你没有想法,那么你应该读一读。我不明白您试图实现什么,以及为什么需要如此复杂的声明?您可能会发现构造复杂的C类型很有帮助。我可以想到许多看起来逻辑性很强但编译器无法识别的声明。我强烈建议使用
typedef
来简化函数指针的使用。定义
typedef void FuncType()并用作
void func_dec(int x,FuncType*funcptr)
因为这不是语法中指定的语法。在用C声明函数时,强烈建议您确切了解工作语法。如果你没有想法,那么你应该读一读。我不明白您试图实现什么,以及为什么需要如此复杂的声明?您可能会发现构造复杂的C类型很有帮助。我可以想到许多看起来逻辑性很强但编译器无法识别的声明。我强烈建议使用
typedef
来简化函数指针的使用。定义
typedef void FuncType()并用作
void func_dec(int x,FuncType*funcptr)@FabioTurati谢谢。我使用“右-左”规则阅读你的版本,你是正确的。我读了我的版本,得到了。。。迷路的我把它从我的answ上取下来了