簡體   English   中英

我可以在函數定義中使用函數typedef嗎?

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

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