在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)
是什么意思?
答案 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