[英]C callbacks through the function pointer and without it. Why there is no difference?
我不明白为什么不同的代码可以正常工作。
#include <stdio.h>
void foo() {
printf("Hello\n");
}
void foo1(void fn()) {
(*fn)();
fn();
}
void foo2(void (*fn)()) {
(*fn)();
fn();
}
int main(void) {
foo1(foo);
foo2(foo);
return 0;
}
如果它们相同,那为什么不起作用?
typedef void F1(), (*F2)();
int main(void) {
F1 f1;
F2 f2;
// error: lvalue required as left operand of assignment
f1 = foo1;
f2 = foo2;
return 0;
}
聚苯乙烯
我感兴趣的不是typedef
(第二个示例)。
我仅对第一个示例有疑问。
那是:
您使用的typedef错误。 第一个F1()
根本不是函数指针。 您的第二部分确实为函数指针(*F2)()
提供了typedef,但是您没有包含类型。 底线,但您不会在一行中得到2个函数指针typedef:
typedef void (*F1)();
typedef void (*F2)();
将创建既为一个typedef F1
和一个typedef F2
。
就功能指针的使用而言 ,可以在有或没有parens和取消引用的情况下使用功能指针。
(*fn)();
fn();
两者都是等效的,只需调用fn
指向的函数。
线
typedef void F1();
F1 f1;
不要将f1
声明为指针。 他们将f1
声明为返回void
的函数。 等效的声明是
void f1();
下面的代码可以证明这一点,它将在编译时没有任何错误或警告。 请注意,如果您注释掉F1 f1;
行F1 f1;
,那么编译器会抱怨“函数f1的隐式声明”和“ f1的类型冲突”,因为您有一个没有声明的前向引用。
typedef void F1();
int main(void)
{
F1 f1;
f1();
return 0;
}
void f1()
{
printf( "hello\n" );
}
另一方面,下面的代码也将在没有警告或错误的情况下进行编译,但是在这种情况下,编译器将f1
视为指向函数的指针。
typedef void F1();
void foo() {
printf( "hello\n" );
}
void foo1(F1 f1) {
f1();
}
int main(void) {
foo1( foo );
return 0;
}
为什么会有所不同? 因为§6.7.6.3函数声明符,第8段为
如6.3.2.1中所述,将参数声明为“函数返回类型”声明调整为“指向函数返回类型的指针”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.