[英]Can I use a function typedef in function definitions?
我定義了:
typedef int FunkyFunc(int x);
現在,我希望能夠在FunkyFunc
類型的函數定義中使用此typedef,例如
FunkyFunc f {
return 2*x;
}
要么
FunkyFunc f(int x) {
return 2*x;
}
要么
FunkyFunc f(x) {
return 2*x;
}
我能做類似上面的任何事嗎? 他們似乎都沒有編譯。
這在標准草案第8.3.5
節的C ++中是不正確的 。 功能第10段說:
函數類型的typedef可用於聲明函數,但不能用於定義函數(8.4)。 [例如:
typedef void F(); F fv; // OK: equivalent to void fv(); F fv { } // ill-formed void fv() { } // OK: definition of fv
- 示例] [...]
我們可以在C中看到,這也是C99標准草案第6.9.1
節中特別禁止的。 函數定義說:
函數定義中聲明的標識符(函數的名稱)應具有函數類型,由函數定義的聲明符部分指定。 141)
和腳注141
說:
目的是函數定義中的類型類別不能從typedef繼承:
並有以下示例:
typedef int F(void); // type F is ‘‘function with no parameters
// returning int’’
F f, g; // fand g both have type compatible with F
F f { /* ... */ } // WRONG: syntax/constraint error
[...]
除了腳注是162
之外, C11說同樣的事情。
不可以。您可以使用typedef 聲明一個函數:
FunkyFunc f;
但必須使用函數式聲明符編寫函數定義。
注意:在C ++中肯定是這種情況,我相當確定C在這方面是相同的; 但是如果你選擇一種語言來討論它會更好,因為C和C ++之間可能存在顯着差異,即使你可以想象它們是相同的。
您可以使用#define
來模擬C語言不允許的內容(正如Mike Seymour的回答所指出的那樣):
#define MYFUNKYFUNC(f) int f(int x)
MYFUNKYFUNC(f1)
{
return x;
}
MYFUNKYFUNC(f2)
{
return 2*x;
}
int main(void)
{
int x1 = f1(2); /* Assigns 2 to x1. */
int x2 = f2(2); /* Assigns 4 to x2. */
return 0;
}
你的同事是否會喜歡你這樣做是一個不同的故事。
只需寫入int f(int x) { return 2*x; }
int f(int x) { return 2*x; }
。
例如,如果要將“FunkyFunc”作為參數傳遞給另一個函數
void do_something(FunkyFunc *func) { ... }
然后你可以簡單地寫
do_something(&f);
你寫的東西不會按你想要的方式工作。 Typedef是另一種類型的別名。 想象一下,你的typedef不僅僅是#define。 然后看看代碼會是什么樣子。
int FunkyFunc(int x) f {
return 2*x;
}
此語法將無法編譯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.