这个typedef语句是什么意思?

在一个C ++参考页面,他们提供了一些typedef的例子,我试图理解他们的意思。

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

所以简单的typedef(第一个声明)我明白了。

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

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

特别是(&fp)(int, mylong)是什么意思?

它一次声明几个typedef,就像你可以同时声明多个variables一样。 它们都是基于inttypes,但有些被修改为复合types。

让我们分解成单独的声明:

 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 
 typedef int int_t, *intp_t, (&fp)(int, mylong), arr_t[10]; 

相当于:

 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 typedef说明符

typedef -name不会像class声明(9.1)或enum声明那样引入新types。例如:after

 typedef int MILES , * KLICKSP ; 

build设

 MILES distance ; extern KLICKSP metricp ; 

都是正确的声明; metricp inttypes是“指向int指针”。 – 例子

如果你有cdecl命令,你可以用它来揭示这些声明。

 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 ,你应该能够以通常的方式安装它(例如在Debiantypes的系统上,使用sudo apt-get install cdecl )。

(&fp)(int, mylong)部分表示对函数的引用。 不build议程序员使用typedef中的函数,因为你提出这个问题的原因。 它混淆了其他人在看代码。

我猜他们使用类似于这样的typedef

 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; } 

按照Brian的评论编辑:

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

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

返回一个int引用的函数的引用看起来像这样: typedef int &(&fp)(int, mylong) (这个在一个程序中编译,但行为未经testing)。

typedef定义了一个在代码中使用的新types,如简写。

 typedef typename _MyBase::value_type value_type; value_type v; //use v 

这里的typename是让编译器知道value_type是_MyBase中的一个types而不是一个对象。

::是types的范围。 它有点像“是”,所以value_type“在_MyBase中。 或者也可以被认为是包含的。

可能的重复: C ++ – 结合typedef和typename的语句的含义