[英]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.