C++ 我可以在函数定义中使用函数typedef吗?

C++ 我可以在函数定义中使用函数typedef吗?,c++,c,function,typedef,C++,C,Function,Typedef,我定义了: typedef int FunkyFunc(int x); 现在,我希望能够在定义FunkyFunc类型的函数时使用这个typedef,例如 FunkyFunc f { return 2*x; } 或 或 我可以做与上述任何一项类似的事情吗?它们似乎都没有编译。只需编写intf(intx){return2*x;} 例如,如果要将“FunkyFunc”作为参数传递给另一个函数 void do_某事(FunkyFunc*func){…} 然后你就可以写了 dou_某事(&f)

我定义了:

typedef int FunkyFunc(int x);
现在,我希望能够在定义
FunkyFunc
类型的函数时使用这个typedef,例如

FunkyFunc f {
    return 2*x;
}

我可以做与上述任何一项类似的事情吗?它们似乎都没有编译。

只需编写
intf(intx){return2*x;}

例如,如果要将“FunkyFunc”作为参数传递给另一个函数

void do_某事(FunkyFunc*func){…}

然后你就可以写了


dou_某事(&f)

否。您可以使用typedef声明函数:

FunkyFunc f;
但函数定义必须使用函数样式声明器编写

注:这是C++中的情况,我确信C在这方面是相同的;但是如果你选择一种语言来询问,那就更好了,因为C和C++之间可能存在显著的差异,即使你可以想象它们是相同的。

< P>这是在C++中从草稿标准部分<代码> > 83.5< /代码>中的不好的形成。函数第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
[...]

C11也说了同样的话,只是脚注是
162

你写的东西不会按你想要的方式工作。Typedef是另一种类型的别名。假设您的typedef只不过是一个#define。然后看看代码是什么样子

int FunkyFunc(int x) f {
return 2*x;
}
此语法将无法编译。

您可以使用
#define
s来模拟C语言不允许的内容(正如s所指出的):


不过,您的同事是否会喜欢您这样做是另一回事。

函数指针可能会在这里有所帮助。这可能是重复的,但这并不是它不起作用的原因。这与语法无关
typedef
s甚至与预处理器宏没有远程关联。如果这个表单没有被特别禁止,那么编译它绝对是有意义的。这是一个有趣的选择,尽管我不想维护它。
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
[...]
int FunkyFunc(int x) f {
return 2*x;
}
#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;
}