37

我有一系列具有相同原型的功能,比如说

int func1(int a, int b) {
  // ...
}
int func2(int a, int b) {
  // ...
}
// ...

现在,我想简化它们的定义和声明。当然我可以使用这样的宏:

#define SP_FUNC(name) int name(int a, int b)

但我想把它保存在 C 中,所以我尝试使用存储说明符typedef

typedef int SpFunc(int a, int b);

这似乎适用于声明:

SpFunc func1; // compiles

但不是为了定义:

SpFunc func1 {
  // ...
}

这给了我以下错误:

error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token

有没有办法正确地做到这一点还是不可能?根据我对 C 的理解,这应该有效,但事实并非如此。为什么?


注意,gcc 理解我想要做什么,因为,如果我写

SpFunc func1 = { /* ... */ }

它告诉我

error: function 'func1' is initialized like a variable

这意味着 gcc 理解 SpFunc 是一个函数类型。

4

2 回答 2

47

您不能使用函数类型的 typedef 定义函数。这是明确禁止的 - 请参阅 6.9.1/2 和相关的脚注:

在函数定义中声明的标识符(它是函数的名称)应具有函数类型,由函数定义的声明符部分指定。

目的是函数定义中的类型类别不能从 typedef 继承:

typedef int F(void); // type F is "function with no parameters
                     // returning int"
F f, g; // f and g both have type compatible with F
F f { /* ... */ } // WRONG: syntax/constraint error
F g() { /* ... */ } // WRONG: declares that g returns a function
int f(void) { /* ... */ } // RIGHT: f has type compatible with F
int g() { /* ... */ } // RIGHT: g has type compatible with F
F *e(void) { /* ... */ } // e returns a pointer to a function
F *((e))(void) { /* ... */ } // same: parentheses irrelevant
int (*fp)(void); // fp points to a function that has type F
F *Fp; //Fp points to a function that has type F
于 2011-01-01T17:51:41.857 回答
0

Atypedef定义了type,而不是 header (这是源代码文本)。如果您需要分解标题的代码,则必须使用#define(尽管我不推荐)。

([编辑]第一个工作的原因是它没有定义原型——它定义了一个由 定义的类型的变量typedef,这不是你想要的。)

于 2011-01-01T17:48:44.137 回答