原讨论链接:http://community.csdn.net/expert/topicview1.asp?id=5298039
所属论坛:C++ 语言 审核组:C/C++
提问者:Dragon_Red 解决者:Dragon_Red
感谢:huangyangman ugg littlebao YourKing fosjos
关键字:函数 C/C++ 变量 指针 C++ 语言 int 定义 替换 struct 括号 别名 typedef
答案:
用途一:
定义一种类型的别名,而不只是简单的宏替换。可以用作同时声明指针型的多个对象。比如:
char* pa, pb; // 这多数不符合我们的意图,它只声明了一个指向字符变量的指针,
// 和一个字符变量;
以下则可行:
typedef char* PCHAR; // 一般用大写
PCHAR pa, pb; // 可行,同时声明了两个指向字符变量的指针
虽然:
char *pa, *pb;
也可行,但相对来说没有用typedef的形式直观,尤其在需要大量指针的地方,typedef的方式更省事。
用途二:
用在旧的C代码中(具体多旧没有查),帮助struct。以前的代码中,声明struct新对象时,必须要带上struct,即形式为: struct 结构名 对象名,如:
struct tagPOINT1
{
int x;
int y;
};
struct tagPOINT1 p1;
而在C++中,则可以直接写:结构名 对象名,即:
tagPOINT1 p1;
估计某人觉得经常多写一个struct太麻烦了,于是就发明了:
typedef struct tagPOINT
{
int x;
int y;
}POINT;
POINT p1; // 这样就比原来的方式少写了一个struct,比较省事,尤其在大量使用的时候
或许,在C++中,typedef的这种用途二不是很大,但是理解了它,对掌握以前的旧代码还是有帮助的,毕竟我们在项目中有可能会遇到较早些年代遗留下来的代码。
用途三:
用typedef来定义与平台无关的类型。
比如定义一个叫 REAL 的浮点类型,在目标平台一上,让它表示最高精度的类型为:
typedef long double REAL;
在不支持 long double 的平台二上,改为:
typedef double REAL;
在连 double 都不支持的平台三上,改为:
typedef float REAL;
也就是说,当跨平台时,只要改下 typedef 本身就行,不用对其他源码做任何修改。
标准库就广泛使用了这个技巧,比如size_t。
另外,因为typedef是定义了一种类型的新别名,不是简单的字符串替换,所以它比宏来得稳健(虽然用宏有时也可以完成以上的用途)。
用途四:
为复杂的声明定义一个新的简单的别名。方法是:在原来的声明里逐步用别名替换一部分复杂声明,如此循环,把带变量名的部分留到最后替换,得到的就是原声明的最简化版。举例:
1. 原声明:int *(*a[5])(int, char*);
变量名为a,直接用一个新别名pFun替换a就可以了:
typedef int *(*pFun)(int, char*);
原声明的最简化版:
pFun a[5];
2. 原声明:void (*b[10]) (void (*)());
变量名为b,先替换右边部分括号里的,pFunParam为别名一:
typedef void (*pFunParam)();
再替换左边的变量b,pFunx为别名二:
typedef void (*pFunx)(pFunParam);
原声明的最简化版:
pFunx b[10];
3. 原声明:doube(*)() (*e)[9];
变量名为e,先替换左边部分,pFuny为别名一:
typedef double(*pFuny)();
再替换右边的变量e,pFunParamy为别名二
typedef pFuny (*pFunParamy)[9];
原声明的最简化版:
pFunParamy e;
理解复杂声明可用的“右左法则”:从变量名看起,先往右,再往左,碰到一个圆括号就调转阅读的方向;括号内分析完就跳出括号,还是按先右后左的顺序,如此循环,直到整个声明分析完。举例:
int (*func)(int *p);
首先找到变量名func,外面有一对圆括号,而且左边是一个*号,这说明func是一个指针;然后跳出这个圆括号,先看右边,又遇到圆括号,这说明(*func)是一个函数,所以func是一个指向这类函数的指针,即函数指针,这类函数具有int*类型的形参,返回值类型是int。
int (*func[5])(int *);
func右边是一个[]运算符,说明func是具有5个元素的数组;func的左边有一个*,说明func的元素是指针(注意这里的*不是修饰func,而是修饰func[5]的,原因是[]运算符优先级比*高,func先跟[]结合)。跳出这个括号,看右边,又遇到圆括号,说明func数组的元素是函数类型的指针,它指向的函数具有int*类型的形参,返回值类型为int。
也可以记住2个模式:
type (*)(....)函数指针
type (*)[]数组指针
---------------------------------
陷阱一:
记住,typedef是定义了一种类型的新别名,不同于宏,它不是简单的字符串替换。比如:
先定义:
typedef char* PSTR;
然后:
int mystrcmp(const PSTR, const PSTR);
const PSTR实际上相当于const char*吗?不是的,它实际上相当于char* const。
原因在于const给予了整个指针本身以常量性,也就是形成了常量指针char* const。
简单来说,记住当const和typedef一起出现时,typedef不会是简单的字符串替换就行。
陷阱二:
typedef在语法上是一个存储类的关键字(如auto、extern、mutable、static、register等一样),虽然它并不真正影响对象的存储特性,如:
typedef static int INT2; //不可行
编译将失败,会提示“指定了一个以上的存储类”。
分享到:
相关推荐
下面将详细阐述 `typedef` 的四个主要用途以及两个需要注意的陷阱。 **用途一:定义类型别名** `typedef` 最基础的用途就是创建一个新类型名,作为已有类型的一个别名。例如,如果经常需要使用指向字符的指针,可以...
详解typedef四用途与两陷阱 typedef语法 声明一个别名 区别于#define思维与用法 详细解析了typedef的四个重要用途与两个误区
#### 一、`typedef`的主要用途 ##### 1. 定义类型的别名 `typedef`最常见的用途之一就是为现有类型定义别名。这种方式可以避免在代码中频繁地重复相同的数据类型定义,提高代码的可读性和可维护性。 **示例**: ...
之后,可以在代码中使用`size`来代替`int`,这不仅可以让代码更具语义性,还能让开发者更容易理解变量的用途。 ```c++ void measure(size *psz); size array[4]; size len = file.getLength(); std::vector<size> ...
四、typedef的四个用途 1. 定义一种类型的别名,而不只是简单的宏替换。例如:typedef char* PCHAR; 2. 用在旧的C代码中,帮助struct。例如:typedef struct tagPOINT { int x; int y; }POINT; 3. 用typedef来定义...
`typedef` 最常见的用途之一就是定义一种类型的别名。这种方式不仅仅实现了宏替换的功能,还能够帮助开发者更清晰地表达代码意图,并减少代码中的潜在错误。 **示例**: ```c // 原始方式可能导致误解 char *pa, ...
typedef 有四个主要用途:定义一种类型的别名、用作同时声明指针型的多个对象、帮助 struct 和定义与平台无关的类型。例如,typedef char* PCHAR; 可以用来定义一个字符指针类型的别名,从而更方便地声明多个指针...
本篇文章将详细介绍`typedef`的四个主要用途,两个需要注意的陷阱,以及它与`#define`的区别。 **`typedef` 的四大用途** 1. **简化复杂类型名**:`typedef` 可用于为复杂的类型定义一个简短易记的名字。例如,当...
`typedef` 最常见的用途之一就是定义易于记忆的类型名,这些类型名可以更好地反映变量的实际用途。例如: ```c typedef int size_t; // 定义一个整型的别名 size_t ``` 这样,当你需要表示某种“大小”时,可以...
`typedef`的一个重要用途是隐藏复杂类型,特别是那些涉及到指针和数组的类型。例如,定义一个固定长度的字符数组: ```c typedef char Line[81]; ``` 然后,可以轻松地声明多个具有相同类型的变量: ```c Line ...
`typedef` 的主要用途包括但不限于: - **提高代码可读性**:为复杂的类型定义简洁的别名。 - **简化复杂类型的书写**:避免重复输入复杂的类型名称。 - **增强代码移植性**:通过定义平台无关的类型别名,使得代码...
为了更好地理解`typedef`的实际用途,我们可以通过一个具体的示例来说明。假设我们需要在程序中频繁使用一个包含姓名、年龄和地址信息的个人资料结构体。没有`typedef`的情况下,每次声明和初始化这个结构体都需要写...
`#define` 和 `typedef` 是 C/C++ 语言中两种不同的类型定义方式,它们各自有不同的特性和用途。 首先,`#define` 是预处理器指令,它的主要功能是在编译之前进行文本替换。这意味着,当你在代码中使用 `#define` ...
typedef 的主要用途之一是定义一种类型的别名。例如,char* 类型可以被定义为 PCHAR,如此可以同时声明多个指针对象。这种方法可以使代码更加美观和易读。 typedef char* PCHAR; PCHAR pa, pb; 二、用于旧的 C ...
C语言中typedef的4个用途和2个陷阱 在C语言中,typedef是定义一种类型的新别名,而不是简单的宏替换。它有四个主要用途和两个陷阱需要注意。 用途一:定义一种类型的别名 typedef可以用来定义一种类型的别名,而不...
`typedef` 最常见的用途之一就是为现有的类型创建易于记忆的同义词。例如: ```c++ typedef int size; ``` 这条语句定义了一个名为 `size` 的类型,它是 `int` 类型的别名。这意味着你可以使用 `size` 来代替 `int...
本文将深入解析`typedef`的四个主要用途,帮助开发者更好地理解和利用这一特性。 用途一:定义类型别名 `typedef` 最基础的用法就是为现有的数据类型创建一个新的名字,这不仅增加了代码的可读性,还可以避免因直接...
typedef的用法 typedef 是 C 和 C++ 语言中的一个关键字,用于为数据类型定义一个新的名称。这可以使得代码更加...当你阅读一段代码时,如果看到了一个 typedef 定义的别名,你可以更容易地理解该变量的用途和类型。
`typedef` 是 C 语言中一个非常有用的工具,它允许我们为现有的数据类型创建新的名字,也就是别名。这样做的好处在于可以使代码更加清晰、易读,并且在跨平台编程时能够灵活地调整数据类型的定义,以适应不同硬件...