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

时间:2013-12-30 13:46:17

标签: c++ c function typedef

我已定义:

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

我可以做类似上面的任何事情吗?他们似乎都没有编译。

5 个答案:

答案 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 Seymouranswer所指出的那样):

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

此语法无法编译。