Могу ли я использовать функцию typedef в определениях функций?

Я определил:

typedef int FunkyFunc(int x); 

Теперь я хотел бы иметь возможность использовать этот typedef в определении функций типа FunkyFunc , например

 FunkyFunc f { return 2*x; } 

или же

 FunkyFunc f(int x) { return 2*x; } 

или же

 FunkyFunc f(x) { return 2*x; } 

могу ли я сделать что-то подобное любому из вышеперечисленных? Ни один из них, похоже, не компилируется.

Это плохо сформировано на C ++ из проекта стандартного раздела 8.3.5 параграфе 10 говорится:

Типичный тип функции может использоваться для объявления функции, но не должен использоваться для определения функции (8.4). [ Пример:

 typedef void F(); F fv; // OK: equivalent to void fv(); F fv { } // ill-formed void fv() { } // OK: definition of fv 

-End example] […]

Мы видим, что в C это также специально запрещено из стандартного раздела проекта C99 6.9.1 Определения функций говорят:

Идентификатор, объявленный в определении функции (который является именем функции), должен иметь тип функции, как определено частью декларатора определения функции. 141)

и примечание 141 гласит:

objective состоит в том, что категория типа в определении функции не может быть унаследована от 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 [...] 

C11 говорит то же самое, кроме сноски 162 .

Нет. Вы можете использовать typedef для объявления функции:

 FunkyFunc f; 

но определение функции должно быть записано с помощью декларатора стиля функции.

Примечание: Это, безусловно, имеет место на C ++, и я уверен, что C в этом отношении одинаково; но было бы лучше, если бы вы выбрали один язык, о котором можно было бы спросить, поскольку между C и C ++ могут быть существенные различия, даже если вы можете себе представить, что они будут одинаковыми.

Вы можете использовать #define s для моделирования того, что не разрешает язык C (как указано в ответе Майка Сеймура ):

 #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; } 

Этот синтаксис не будет компилироваться.