Typedef和cast

时间:2012-11-04 14:27:26

标签: c++ casting typedef

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 个答案:

答案 0 :(得分: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;的抽象类型,然后您会发现需要将其从unsigned char更改为一个unsigned short,只有一个地方可以进行更改,如果您对该类型的使用相当严格,那么这将是您需要进行更改的唯一地方。

答案 1 :(得分:1)

  

或许有时缩短打字很有用。你什么时候建议使用typedef?

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

typedef int32_t pixel_t;

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

typedef int distance_t;

typedef int angular_momentum_t;

答案 2 :(得分:1)

您的问题已在其他question中得到解答。

typedef是有用的(在C和C ++中,也可能是Objective-C?)来抽象实现细节。优秀的做法是将类型隐藏到程序的某些部分,这些部分不需要知道如何实现类型,以避免污染该代码与其功能无关的问题,并且更容易更改类型实现必须改变那段代码。

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

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

答案 3 :(得分:0)

在某些情况下,

typedef用于隐藏表示数据的基础类型。

例如,标准未指明short intintlong int的典型大小,这可能是一个问题。另一方面,实现应该(现在)提供int8_tint16_tint32_tint64_t(以及可能int128_t,具体取决于平台)所以你可以在处置时使用已知值范围的整数。

但是int32_t是什么?好吧,它是一个带符号的整数,宽度为32位。它理论上可以是charshort intintlong intlong long int中的任何一个......它应该不重要:它是一个实现细节

因此,在您的标准库标题中的某些位置,您会看到:

typedef int int32_t; // most likely representation

这个定义取决于平台。

在您的代码中,使用int32_t让您留下那些可怕的平台特点,专注于手头的业务:您的业务