为什么不能使用函数的typedef来定义函数?

She*_*evy 10 c++ typedef function-declaration

从ISO/IEC 14882:2011(E)的§8.3.5.11开始:

函数类型的typedef可用于声明函数,但不得用于定义函数

标准继续给出这个例子:

typedef void F();
F fv; // OK: equivalent to void fv();
F fv { } // ill-formed
void fv() { } // OK: de?nition of fv
Run Code Online (Sandbox Code Playgroud)

这条规则的动机是什么?它似乎限制了函数typedef的潜在表达用途.

Yu *_*Hao 12

虽然这个问题是关于C++的,但是由于C++继承了C语言typedef并且函数指针,所以在这里可以使用C中相同问题的解释.对C有一个正式的解释.

国际标准的基本原理 - 编程语言 C§6.9.1 函数定义

参数列表必须明确存在于声明符中; 它不能从a继承typedef(见§6.7.5.3).也就是说,给定定义:

typedef int p(int q, int r);
Run Code Online (Sandbox Code Playgroud)

以下片段无效:

p funk // weird
{ return q + r ; }
Run Code Online (Sandbox Code Playgroud)

一些当前的实现重写了一个类型,例如,一个char参数就像它被声明一样int,因为已知参数int在没有原型的情况下被传递.但是,标准要求将收到的参数转换为就像在函数输入时的赋值一样.因此不再允许类型重写.

  • 我希望看到 C++ 标准的类似基本原理文档。有吗?(到目前为止,我读过的最好的方法是 Stroustrup 的书......) (2认同)

Kei*_*son 7

这可能主要是历史原因.typedef是C的相对较晚的添加,并且被添加到现有语言上(并且在编译器的解析阶段引起了一些问题).

此外,函数定义必须定义参数的名称(如果有).函数类型包括函数的返回类型和参数类型,但不包括其参数名称.例如,这些:

void (int)
void (int x)
void (int y)
Run Code Online (Sandbox Code Playgroud)

有三种编写相同功能类型的方法.如果你有:

typedef void func_t(int);
Run Code Online (Sandbox Code Playgroud)

然后这个假设的定义:

func_t some_func { }
Run Code Online (Sandbox Code Playgroud)

不会为其int参数定义名称.我不确定如何以合理的方式解决这个问题.我想,这是可能的,但它从未完成过.

但最重要的可能就是Dennis Ritchie要么不认为定义如何typedef在函数定义中使用它,或者他根本没有想到它.

  • @BenjaminLindley:是的,但这意味着没有通过`typedef`定义的函数可以有命名参数.这将是一个恼人和任意的限制.如果没有能够概括它,就不值得允许一个特殊情况.而且,在typedef发起的地方,C不允许在函数定义中使用无名参数. (2认同)