簡體   English   中英

C99中的哪個規定禁止通過typedef定義函數?

[英]Which provision in C99 forbids definition of a function through typedef?

我知道函數定義不能通過typedef來完成。 例如:

typedef int f_t(int x, int y);

f_t fsum
{
    int sum;
    sum = x + y;
    return sum;
}

但是我找不到在C99中禁止這個定義的規定。 哪些條款有關,以及它們如何禁止這一定義?

這在描述函數定義的子句中立即給出:

6.9.1函數定義

約束

2 - 在函數定義中聲明的標識符(函數的名稱)應具有函數類型,由函數定義的聲明符部分指定。 141)

141)意圖是函數定義中的類型類別不能從typedef繼承[...]

這種方法的工作方式是在聲明符(6.7.5)下,唯一的函數聲明符(6.7.5.3)是在標識符后帶括號的函數聲明符:

TD( 參數類型列表 )
TD( 標識符列表選擇 )

因此,如果函數是通過typedef定義的,那么它沒有函數聲明符的語法形式,因此6.9.1p2無效。

考慮嘗試的typedef函數定義的語法細分可能有所幫助:

typedef int F(void);

F f {}
| | ^^-- compound-statement
| ^-- declarator
^-- declaration-specifiers

注意,類型的typedef F聲明-符的一部分,而不是說明符的一部分,所以f (該聲明符部分)不具有的功能的類型。

既然你在詢問禁止在函數定義中使用typedef的意圖 (在一些評論中),那么C99的基本原理就是這樣說的:

參數列表必須明確存在於聲明符中; 它不能從typedef繼承(參見§6.7.5.3)。 也就是說,給定定義:

 typedef int p(int q, int r); 

以下片段無效:

 p funk // weird { return q + r ; } 

所以看起來函數defintion-by-typedef是不允許的,因為在那種情況下定義看起來不像函數。

暫無
暫無

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

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