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