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
答案 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 int
,int
或long int
的典型大小,这可能是一个问题。另一方面,实现应该(现在)提供int8_t
,int16_t
,int32_t
和int64_t
(以及可能int128_t
,具体取决于平台)所以你可以在处置时使用已知值范围的整数。
但是int32_t
是什么?好吧,它是一个带符号的整数,宽度为32位。它理论上可以是char
,short int
,int
,long int
或long long int
中的任何一个......它应该不重要:它是一个实现细节。
因此,在您的标准库标题中的某些位置,您会看到:
typedef int int32_t; // most likely representation
这个定义取决于平台。
在您的代码中,使用int32_t
让您留下那些可怕的平台特点,专注于手头的业务:您的业务。