5

typedef似乎是 C++ 特定的(也许在其他一些语言中)。我发现它隐藏了值的真实数据类型,因此使项目新手感到困惑。也许有时缩短打字时间很有用。您建议什么时候使用typedef

我还注意到我不能将 typedef-ed 值传递给接受基础类型的函数?

就像是:

typedef string VAL;
VAL s = "x";
func(string x); // if I try to pass `s`, I get something like no instance of function template match argument list
4

4 回答 4

4

typedef是用于从现有类型创建新类型的 C 和 C++ 语言标签。最好的地方是将它与具有以下示例的结构的 C 编程语言一起使用,或者使用它从现有的原始类型(短、长等)创建一个新的、更抽象的类型。

typedef struct {
    int iValue;
    int jValue;
} MyValues;
// declare a variable with this struct
MyValues aMyValuesStruct;

在将 typedef 引入 C 之前,为了将上述结构用作类型,您必须执行以下操作:

struct _MyValuesStruct {
    int iValue;
    int jValue;
};
// declare a variable with this struct
struct _MyValuesStruct aMyValuesStruct;

在 C++ 中,结构和类是创建新类型的类似结构,因此typedef对于这些类型的变量没有那么有用。但是,如果您使用内置的原始类型来表示其他更抽象的类型,那么 typedef 语句可以帮助您以更抽象的方式指定类型。

这种使用typedef使得为类型指定标签变得更加容易,因此当程序员阅读源代码时,他们可以理解特定变量代表什么。例如,如果您有一个颜色值unsigned short变量typedef适合unsigned short.

还允许的是typedef,它可以更容易地找到源中使用特定抽象类型的所有位置,并且更容易更改底层类型。例如,如果您的颜色值类型以字节开始,因此您typedef用来创建抽象类型,例如typedef unsigned char ColorValue;,然后您发现需要将其从 anunsigned char更改unsigned short为该类型的使用相当严格,这将是您需要进行更改的唯一地方。

于 2012-11-04T14:43:31.980 回答
1

也许有时缩短打字时间很有用。什么时候推荐使用 typedef?

一个很好的用例是当您希望能够在不编辑代码库的情况下重新映射类型:

typedef int32_t pixel_t;

另一个是您希望类型更明确,以便代码的使用变得更清晰:

typedef int distance_t;

typedef int angular_momentum_t;
于 2012-11-04T14:31:43.247 回答
1

您的问题在另一个问题中得到了回答。

typedefs 对于抽象实现细节很有用(在 C 和 C++ 中,也许还有 Objective-C?)。将类型隐藏到程序中不需要知道类型是如何实现的部分是一种很好的做法,以避免由于与其功能无关的问题而污染代码,并且可以更容易地更改类型实现而不不得不更改该代码。

如果在可能的情况下隐藏了不必要的细节,那么该项目的新手可能会发现处理代码实际上更容易。

至于你的问题,func(string x);是函数原型声明,而不是函数调用。

于 2012-11-04T14:42:57.430 回答
0

typedef在某些情况下,用于隐藏表示数据的基础类型。

例如,标准未指定 a 的典型大小short intint或者long int是,这可能是一个问题。另一方面,实现应该(现在)提供int8_tint16_t和(int32_t并且int64_t可能int128_t取决于平台),以便您可以拥有具有已知值范围的整数。

但什么是int32_t?嗯,它是一个有符号整数,宽度为 32 位。它可以是char, short int, int,long intlong long int理论上的任何一个……这无关紧要:它是一个实现细节

因此,在您的标准库头文件中的某个时刻,您会看到:

typedef int int32_t; // most likely representation

这个定义是基于平台的。

在您的代码中,使用可以int32_t让您摆脱那些可怕的平台特性,专注于手头的业务:您的业务

于 2012-11-04T15:00:24.120 回答