簡體   English   中英

C 中函數 typedef 的前向聲明

[英]Forward declaration of a function typedef in C

我一直懷疑以前有人問過這個問題,但我沒有找到......

假設我有一個函數 A 的 typedef,它接受一個指向帶有 typedef B 的函數的指針,后者又接受一個 typedef A 的函數。如果其中一個是結構,我知道我將如何處理前向聲明,但對於函數我不知道語法。 有嗎?

我希望能夠做到:

typedef void (*function_A_t)(function_B_t f_B);
typedef void (*function_B_t)(function_A_t f_A);

任何提示? 更好的是,參考? 順便說一句,這實際上只是發生在我身上,但我能夠以另一種方式修復它,盡管這實際上會更順暢(更好的解耦,下一個人搞砸的機會更少),如果可能的話。

您可以利用以下事實來做到這一點:C 指定沒有參數的函數聲明意味着它需要不確定數量的參數。

所以你可以這樣做:

typedef void (*function_A_t)(void (*)());
typedef void (*function_B_t)(function_A_t f_A);

這允許以下編譯:

void A(function_B_t b)
{
    b(A);
}

void B(function_A_t a)
{
    a(B);
}

int main()
{
    function_A_t a = A;
    function_B_t b = B;
    a(B);
    b(A);
    return 0;
}

C 標准的第 6.7.6.3p15 節陳述了以下關於函數類型兼容性的內容:

對於要兼容的兩個函數類型,都應指定兼容的返回類型。 此外,參數類型列表(如果兩者都存在)應在參數數量和省略號終止符的使用方面達成一致; 相應的參數應具有兼容的類型。 如果一種類型具有參數類型列表,而另一種類型由不屬於函數定義的一部分且包含空標識符列表的函數聲明符指定,則參數列表不應有省略號終止符,並且每個參數的類型應與應用默認參數提升所產生的類型兼容。 如果一種類型具有參數類型列表,而另一種類型由包含(可能為空)標識符列表的函數定義指定,則兩者應在參數數量上一致,並且每個原型參數的類型應與類型兼容這是由於將默認參數提升應用於相應標識符的類型而產生的。 (在確定類型兼容性和復合類型時,以函數或數組類型聲明的每個參數視為具有調整類型,每個以限定類型聲明的參數視為具有其聲明類型的非限定版本。)

上面粗體部分表示void (*)()void (*)(function_B_t)兼容

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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