这个typedef语句是什么意思?

时间:2014-02-27 07:23:48

标签: c++ 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)是什么意思?

5 个答案:

答案 0 :(得分:96)

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

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

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 :(得分:41)

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 - 名称不会像class声明(9.1)或enum声明那样引入新类型。例如:之后

typedef int MILES , * KLICKSP ;
     

结构

MILES distance ;
extern KLICKSP metricp ;
     

都是正确的声明;距离的类型是metricp的“指向int的指针。” - 示例

答案 2 :(得分:32)

如果您拥有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,则应该能够以通常的方式安装它(例如,在Debian类型的系统上,使用sudo apt-get install cdecl)。

答案 3 :(得分:0)

(&fp)(int, mylong)部分表示对函数的引用。由于您提出此问题的原因,不建议程序员使用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(...)是一个名为name 的函数,返回对int的引用

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

答案 4 :(得分:-7)

typedef定义了一个在代码中使用的新类型,如速记。

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

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

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

可能重复:C++ - meaning of a statement combining typedef and typename