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