Typedef和函数声明

时间:2013-10-13 21:02:43

标签: c++ typedef

我正在写:

typedef int foo();
...
foo bar
{
    return 1;
}

但我有error C2206,那个typedef不能用于函数声明。是什么导致这个错误?我认为foo bar应该编译为int bar()

2 个答案:

答案 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)();

此外,您在功能声明

中缺少parens
foo bar()
{
    return 1;
}

1也不是合法的函数指针值。

foo bar()
{
    return 1;  // this line is an error
}