0

我正在尝试写:

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

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

4

2 回答 2

3

本声明:

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++)。

于 2013-10-13T21:51:07.677 回答
1

函数指针 typedef 的声明是

typedef int (*foo)();

此外,您的函数声明中缺少括号

foo bar()
{
    return 1;
}

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

foo bar()
{
    return 1;  // this line is an error
}
于 2013-10-13T21:03:28.733 回答