簡體   English   中英

C通過函數指針(沒有它)進行回調。 為什么沒有區別?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM