此typedef语句是什么意思?


76

在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)意思?


47
应该注意的是,像这样编写单线typedef goo是非常差劲的编程实践,因为它很难阅读,并且没有任何好处。因此,如果您正在阅读本文并且从未见过这样的typedef,请不要开始使用此语法。
伦丁

3
@伦丁我不同意。将它们全部放在一行上可以清楚地表明,您打算使它们全部都引用相同的基本类型。根据定义。
李斯特先生,2014年

9
@MrLister如果将它们依次写在一行中,则每一行都将以该行开头,typedef some_type ...并且您会有类似的几行,您的意图非常明确,语法空缺。更具可读性。
伦丁

2
@Lundin可能是一个口味问题,所以我不确定是否需要对此进行讨论。
李斯特先生,2014年

Answers:


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

5
在我多年的C ++编程生涯中,我还不知道!我想我的导师不认为有必要学习它,而我从没发现任何东西。+1
约翰·奥多姆

17
你的老师是对的。这很难阅读,这是您不应该使用的功能。
Plutor

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

typedef-name不引入新类型的方式的class声明(9.1)或enum声明does.Example:后

typedef int MILES , * KLICKSP ;

建筑

MILES distance ;
extern KLICKSP metricp ;

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


13
据我了解,答案是正确的。为什么会有反对票?
2014年

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)。


@athos来自sudo apt-get install cdecl
Amarghosh '16

哦,不是Windows吗?
athos

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(...)是一个称为返回对int的引用的函数name

对返回引用的函数的int引用将类似于以下内容:(typedef int &(&fp)(int, mylong)此代码可在程序中编译,但行为未经测试)。


3
否,int&(int, mylong)与的类型不同int(&)(int, mylong)。前者是一个返回的引用的函数int。后者是对return函数的引用int。对函数的引用是晦涩的,不是很有用,但是它们确实存在于C ++中。
布莱恩

当然,这有点复杂,但是替代品是什么?不使用typedef吗?您仍然需要类型,但是没有typedef的话,您就必须在需要的地方显式使用相同的函数类型,这比以前复杂十倍,并且容易出错。程序员不必在一个地方正确设置一个typedef,而是需要在许多地方正确设置一个类型。
gnasher729 2014年

2
由谁“推荐”?用于函数指针的Typedef在许多用于回调的C API中非常常用,并且使用typedef意味着以函数指针作为其参数的函数更具可读性。除非可以使用C ++ lambda,否则如果实现例如异步API,则函数指针typedef的IMO编码样式比直接使用它们更好。
uliwitness 2014年

-7

typedef定义了一种在代码中使用的新类型,如简写形式。

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

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

::是类型的范围。它有点像“在”中,因此value_type“在” _MyBase中。或也可以视为包含。

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


10
这个答案没有帮助。这个问题清楚地表明,他们理解a的基本概念typedef(您已经解释过),但是对更复杂的a(您甚至没有涉及)感到困惑。
mirabilos 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.