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

11

我定义了:

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

我能否做类似于上述任何一个的事情?它们中似乎没有一个编译成功。


也许函数指针可以在这里帮上忙。 - Dipto
1
可能是 https://dev59.com/7lTTa4cB1Zd3GeqPwubj 的重复问题。 - Ignitor
5个回答

9

这段来自草案标准的第8.3.5节函数的第10段指出,在C++中这是不良构造的

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 ][...]

我们可以在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之外,说的都是相同的内容。


5

不可以。你可以使用typedef来声明一个函数:

FunkyFunc f;

但函数定义必须使用函数样式声明符写成。

注:这在 C++ 中是肯定的,我相信 C 也是一样的;但是最好选择一种语言进行提问,因为即使在你认为它们应该相同的地方,C 和 C++ 之间也可能存在重大差异。


1
你可以使用#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;
}

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


1
这是一个有趣的选择,尽管我不想维护它。 - Shafik Yaghmour

-1
你写的代码不会按照你想要的那样运行。Typedef 是另一种类型的别名。想象一下,你的 typedef 不过是一个 #define。然后看看代码会是什么样子。
int FunkyFunc(int x) f {
return 2*x;
}

这个语法无法编译。


4
这不是它无法工作的原因。与语法无关;typedef 甚至与预处理器宏没有任何关系。如果这种形式没有被特别禁止,它完全可以编译通过。 - user529758

-1

只需编写 int f(int x) { return 2*x; }

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

void do_something(FunkyFunc *func) { ... }

那么您可以简单地编写

do_something(&f);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接