我已定义:
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;
}
我可以做类似上面的任何事情吗?他们似乎都没有编译。
答案 0 :(得分:9)
C ++ C ++ 来自草案标准部分8.3.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
-end example] [...]
我们可以在 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 表示相同的内容。
答案 1 :(得分:4)
没有。您可以使用typedef 声明函数:
FunkyFunc f;
但函数定义必须使用函数式声明符编写。
注意:在C ++中肯定是这种情况,我相当确定C在这方面是相同的;但是如果你选择一种语言来讨论它会更好,因为C和C ++之间可能存在显着的差异,即使你可能认为它们是相同的。
答案 2 :(得分:1)
您可以使用#define
来模拟C语言不允许的内容(正如Mike Seymour的answer所指出的那样):
#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;
}
你的同事是否愿意这样做是一个不同的故事。
答案 3 :(得分:-1)
只需写下int f(int x) { return 2*x; }
。
如果要将“FunkyFunc”作为参数传递给另一个函数,例如
void do_something(FunkyFunc *func) { ... }
然后你可以简单地写
do_something(&f);
答案 4 :(得分:-1)
你所写的内容不会按照你想要的方式运作。 Typedef是另一种类型的别名。想象一下,你的typedef不仅仅是#define。然后看看代码会是什么样子。
int FunkyFunc(int x) f {
return 2*x;
}
此语法无法编译。