我正在写:
typedef int foo();
...
foo bar
{
return 1;
}
但我有error C2206
,那个typedef不能用于函数声明。是什么导致这个错误?我认为foo bar
应该编译为int bar()
。
答案 0 :(得分:2)
此声明:
typedef int foo();
完全有效。它将foo
定义为类型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 */
甚至有时候这会很方便。 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;
看起来就像一个对象声明,但它会声明一个函数(必须在别处定义)。并允许函数 definitions 的typedef:
signal_handler foo { /* ... */ }
需要更改语言语法 - 并且在查看定义时会很难看到参数和返回类型。此外,与声明不同,函数定义需要任何参数的名称,这会增加另一个复杂程度。
但我认为真正的原因是Dennis Ritchie在设计C时,要么没有想到它,要么认为不值得(而且Stroustrup没有足够的理由改变当他设计C ++时。)
答案 1 :(得分:1)
函数指针typedef的声明是
typedef int (*foo)();
此外,您在功能声明
中缺少parensfoo bar()
{
return 1;
}
1
也不是合法的函数指针值。
foo bar()
{
return 1; // this line is an error
}