关于c ++:这个typedef语句是什么意思?

What does this typedef statement mean?

在C++参考页面中,它们提供了一些TyPufF示例,我试图理解它们的含义。

1
2
3
4
5
6
// simple typedef
typedef unsigned long mylong;


// more complicated typedef
typedef int int_t, *intp_t, (&fp)(int, mylong), arr_t[10];

所以我理解的简单typedef(第一个声明)。

但是他们用第二个声明什么(下面重复)?

1
typedef int int_t, *intp_t, (&fp)(int, ulong), arr_t[10];

尤其是(&fp)(int, mylong)是什么意思?


它一次声明几个typedef,就像一次声明几个变量一样。它们都是基于int的类型,但有些被修改为复合类型。

让我们把它分成单独的声明:

1
2
3
4
typedef int int_t;              // simple int
typedef int *intp_t;            // pointer to int
typedef int (&fp)(int, ulong);  // reference to function returning int
typedef int arr_t[10];          // array of 10 ints


1
typedef int int_t, *intp_t, (&fp)(int, mylong), arr_t[10];

相当于:

1
2
3
4
typedef int int_t;
typedef int *intp_t;
typedef int (&fp)(int, mylong);
typedef int arr_t[10];

实际上,C++ 11标准中有一个类似的例子:

C++11 7.1.3 The typedef specifier

A typedef-name does not introduce a new type the way a class declaration (9.1) or enum declaration does.Example: after

1
typedef int MILES , * KLICKSP ;

the constructions

1
2
MILES distance ;
extern KLICKSP metricp ;

are all correct declarations; the type of distance is int that of metricp is"pointer to int." —end example


如果您有cdecl命令,那么可以使用它来解除这些声明的神秘化。

1
2
3
4
cdecl> explain int (&fp)(int, char)
declare fp as reference to function (int, char) returning int
cdecl> explain int (*fp)(int, char)
declare fp as pointer to function (int, char) returning int

如果您没有cdecl,则应该能够按常规方式安装(例如,在debian类型的系统上,使用sudo apt-get install cdecl)。


(&fp)(int, mylong)部分表示对函数的引用。不建议程序员使用typedef中的函数,这正是您提出这个问题的原因。它会让其他人混淆代码。

我猜他们是用typedef来做这种事的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
typedef unsigned long mylong; //for completeness
typedef int (&fp)(int, mylong);
int example(int param1, mylong param2);

int main() {
     fp fp_function = example;
     int x = fp_function(0, 1);
     return 0;
}

int example(int param1, mylong param2) {
     // does stuff here and returns reference
     int x = param1;
     return x;
}

根据布莱恩的评论编辑:

int(&name)(...)是一个名为name的函数引用(函数返回一个int)

int &name(...)是一个名为name的函数,返回对int的引用。

对返回int引用的函数的引用如下所示:typedef int &(&fp)(int, mylong)(它在程序中编译,但行为未经测试)。


typedef正在定义一个新类型,以便在代码中使用,就像一个速记。

1
2
3
typedef typename _MyBase::value_type value_type;
value_type v;
//use v

这里的typename让编译器知道value类型是一种类型,而不是mybase中的对象。

::是类型的作用域。它有点像"在"中,所以"值类型"在"我的基础"中。或者也可以被认为是包含物。

可能的复制:C++——结合Type和Type名称的语句含义