函数原型 typedef 可以在函数定义中使用吗?
我有一系列具有相同原型的函数,比如说
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 是一个函数类型。
I have a series of functions with the same prototype, say
int func1(int a, int b) {
// ...
}
int func2(int a, int b) {
// ...
}
// ...
Now, I want to simplify their definition and declaration. Of course I could use a macro like that:
#define SP_FUNC(name) int name(int a, int b)
But I'd like to keep it in C, so I tried to use the storage specifier typedef
for this:
typedef int SpFunc(int a, int b);
This seems to work fine for the declaration:
SpFunc func1; // compiles
but not for the definition:
SpFunc func1 {
// ...
}
which gives me the following error:
error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token
Is there a way to do this correctly or is it impossible?
To my understanding of C this should work, but it doesn't. Why?
Note, gcc understands what I am trying to do, because, if I write
SpFunc func1 = { /* ... */ }
it tells me
error: function 'func1' is initialized like a variable
Which means that gcc understands that SpFunc is a function type.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您不能使用函数类型的 typedef 来定义函数。这是明确禁止的 - 请参阅 6.9.1/2 和相关脚注:
You cannot define a function using a typedef for a function type. It's explicitly forbidden - refer to 6.9.1/2 and the associated footnote:
typedef
定义类型,而不是标头(它是源代码文本)。如果您需要提取标头的代码,则必须使用#define
(尽管我不推荐它)。([编辑]第一个起作用的原因是它没有定义原型 - 它定义了由
typedef
定义的类型的变量,这不是您想要的。)A
typedef
defines a type, not a header (which is source code text). You have to use#define
(although I don't recommend it) if you need to factor out the code for the header.([Edited] The reason the first one works is that it's not defining a prototype -- it's defining a variable of the type defined by the
typedef
, which isn't what you want.)