我定义了:
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;
}
我能否做类似于上述任何一个的事情?它们中似乎没有一个编译成功。
我定义了:
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节函数的第10段指出,在C++中这是不良构造的。
我们可以在C语言中看到,这也被明确禁止在C99草案标准的6.9.1节“函数定义”中规定:A typedef of function type may be used to declare a function but shall not be used to define a function (8.4). [ Example:
typedef void F(); F fv; // OK: equivalent to void fv(); F fv { } // ill-formed void fv() { } // OK: definition of fv
—end example ][...]
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
来模拟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 FunkyFunc(int x) f {
return 2*x;
}
这个语法无法编译。
typedef
甚至与预处理器宏没有任何关系。如果这种形式没有被特别禁止,它完全可以编译通过。 - user529758只需编写 int f(int x) { return 2*x; }
。
如果您想将“FunkyFunc”作为参数传递给另一个函数,例如
void do_something(FunkyFunc *func) { ... }
那么您可以简单地编写
do_something(&f);