这个 typedef 语句是啥意思?
Posted
技术标签:
【中文标题】这个 typedef 语句是啥意思?【英文标题】:What does this typedef statement mean?这个 typedef 语句是什么意思? 【发布时间】:2014-03-30 11:35:33 【问题描述】:在 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 goo 是非常糟糕的编程习惯,因为它很难阅读,而且没有任何优势。因此,如果您正在阅读本文并且从未见过这样的 typedef,请不要开始使用这种语法。 @Lundin 我不同意。将它们全部放在一行中可以清楚地表明您打算让它们都引用相同的基本类型。根据定义。 @MrLister 如果你把它们一个接一个地写在一个单独的行,每行都以typedef some_type ...
开头,你有几行这样的,你的意图很清楚,没有语法的空间滑倒。更具可读性。
@Lundin 这可能是个人喜好问题,所以我不确定我们是否需要就此进行讨论。
【参考方案1】:
它一次声明多个 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
【讨论】:
在我多年的 C++ 编程中,我并不知道这一点!我想我的导师不相信有必要学习这一点,而且我从来没有发现任何关于它的东西。 +1 你的导师是对的。这更难阅读,这是您不应该使用的功能。【参考方案2】: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
声明那样引入新类型。示例:之后typedef int MILES , * KLICKSP ;
结构
MILES distance ; extern KLICKSP metricp ;
都是正确的声明;距离的类型是 int,
metricp
的类型是“指向int
的指针”。 ——结束示例
【讨论】:
据我了解,答案是正确的。为什么会有反对票?【参考方案3】:如果您有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
哦,所以它不适用于 Windows?【参考方案4】:
(&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;
根据布赖恩的评论编辑:
int(&name)(...)
是一个名为name
的函数引用(该函数返回一个int)
int &name(...)
是一个名为 name
的函数返回对 int 的引用
对返回 int
引用的函数的引用如下所示:typedef int &(&fp)(int, mylong)
(在程序中编译,但行为未经测试)。
【讨论】:
不,int&(int, mylong)
与 int(&)(int, mylong)
是不同的类型。前者是一个返回对int
的引用的函数。后者是对返回 int
的函数的引用。对函数的引用是晦涩难懂的,不是很有用,但它们确实存在于 C++ 中。
当然有点复杂,但是有什么替代方案呢?不使用类型定义?您仍然需要该类型,但如果没有 typedef,您必须在需要的任何地方显式使用相同的函数类型,这会造成十倍的混乱,当然也容易出错。程序员不必让一个 typedef 正确,而是需要在许多地方正确地输入类型。
“推荐”谁?函数指针的类型定义在众多用于回调的 C API 中非常常用,使用类型定义意味着将函数指针作为其参数的函数更具可读性。除非你可以使用 C++ lambda,否则函数指针 typedef 是 IMO 比直接使用它们更好的编码风格,如果你实现例如异步 API。【参考方案5】:
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
【讨论】:
这个答案没有帮助。问题清楚地表明他们了解typedef
的基本概念(您已解释过),但对更复杂的概念(您甚至没有触及)感到困惑。以上是关于这个 typedef 语句是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章
这个声明是啥 typedef void foo();意思是? [关闭]
typedef enum与typedef struct分别是啥意思