我正在尝试写:
typedef int foo();
...
foo bar
{
return 1;
}
但是我有error C2206
,那个 typedef 不能用于函数声明。是什么导致了这个错误?我认为foo bar
应该编译为int bar()
.
本声明:
typedef int foo();
是完全有效的。它定义foo
为 type 的别名int()
,或“函数返回int
且不带参数”。
(旁白:C(void)
用来表示没有参数;C++ 使用()
。这个答案的早期版本是基于 C 规则的。)
为指向函数类型而不是函数类型定义 typedef 更为常见,但两者都是有效的。鉴于上述 typedef,您可以将函数指针对象声明为:
foo *funcptr;
但是您不能使用 typedef 声明或定义函数。如果语言允许,您可以将函数声明为:
foo func; /* would be equivalent to "int func(void);" *if* it were legal */
或者:
foo func { return 42; }; /* would be equivalent to
"int func(void) { return 42; }"
*if* it were legal */
有时这会很方便。在or中定义的标准signal
函数有一个相当复杂的声明:<signal.h>
<csignal>
void (*signal(int sig, void (*func)(int)))(int);
您可以typedef
为信号处理程序的函数类型定义一个:
typedef void (signal_handler)(int);
将允许signal
被声明为:
void (*signal(int sig, signal_handler *func);
但是您不能使用该 typedef 来声明或定义自己的信号处理程序——尽管您可以有用地使用它来声明指向信号处理程序函数的指针:
signal_handler *funcptr = my_handler;
signal(SIGINT, funcptr);
这同样适用于qsort()
和所需的函数指针参数bsearch()
。
那么既然可以为函数类型定义typedef,为什么不能用它来声明或定义函数呢?
我认为没有什么深层次的原因。语言只是不允许这样做。对于函数声明,一个问题是
signal_handler foo;
看起来就像一个对象声明,但它会声明一个函数(必须在其他地方定义)。并允许函数定义的 typedef :
signal_handler foo { /* ... */ }
将需要更改语言语法 - 并且在查看定义时很难看到参数和返回类型。此外,与声明不同,函数定义需要为任何参数命名,这会增加另一个级别的复杂性。
但我认为,真正的原因是丹尼斯·里奇(Dennis Ritchie)在设计 C 时,要么没有考虑到它,要么认为它不值得(而 Stroustrup 没有足够好的理由来改变它,当他设计的 C++)。
函数指针 typedef 的声明是
typedef int (*foo)();
此外,您的函数声明中缺少括号
foo bar()
{
return 1;
}
也不1
是合法的函数指针值。
foo bar()
{
return 1; // this line is an error
}