typedef
一,定义
typedef:声明自定义数据类型,配合各种原有数据类型,用来简化编程。
二,用途
1,便于移植
typedef int INT32;
INT32 a;//定义整型变量
(INT32) a;//强制转换类型
为什么有int 还要取同名 INT32 ?
答:A微处理器 int 16位,long 32位
B微处理器 short 16位,int 32位,long 64位
原本A处理器下程序:
typedef int INT16;
typedeflong INT32;
要移植到B处理器下,则仅仅需要更改这些新名称就行,而不用更改整个程序。
typedefshort INT16;
typedefint INT32;
2,在旧的C代码中,帮助struct。
由于在旧的C代码中,声明struct对象时,必须带上struct。
如:struct node
{
int data;
struct node next; //C语言中必须带上 struct ;而在C++中则可以省略struct
};
而写成
typedef struct node
{
int data;
}node_re;
node_re root;
3,定义已有类型的一种别名
typedef char *pchar;
pchar pa,pb;
为指针声明typedef 时,容易出现问题。所以建议:只要为指针声明 typedef,那么都要在最终的 typedef 名称中加一个 const,以使得该指针本身所指对象不会通过指针被修改。
typedef const char *pchar;
define
一,定义:定义宏,即允许用一个标示符来表示一个字串。
二,用处:
1,方便程序修改
定义程序中经常使用的常量,这样在常量改变时,不用对整个程序进行修改。
例如:#define pi 3.141592653 //不用每次都输入3.141592653 直接输入 pi
2,提高程序运行效率
C语言中,函数的使用可以使程序更加模块化,便于组织,而且可以重复利用。
但是,函数调用时,需要保留调用函数的现场,便于子函数执行结束后能返回继续执行。在子函数执行完后要恢复调用函数的现场,这需要一定时间。
如果子函数执行操作较多,这种转换时间可以忽略。但是如果执行功能较少,则开销相对较大。
例如:#define S(a,b) a*b //仅仅是一条乘法 操作
define与typedef的区别
typedef只是为了增加可读性而为标识符另起的新名称(仅仅只是个别名),而#define原本在C中是为了定义常量,到了C++,const、enum、inline的出现使它也渐渐成为了起别名的工具。有时很容易搞不清楚与typedef两者到底该用哪个好,如#define INT int这样的语句,用typedef一样可以完成,用哪个好呢?我主张用typedef,因为在早期的许多C编译器中这条语句是非法的,只是现今的编译器又做了扩充。为了尽可能地兼容,一般都遵循#define定义“可读”的常量以及一些宏语句的任务,而typedef则常用来定义关键字、冗长的类型的别名。
宏定义只是简单的字符串代换(原地扩展),而typedef则不是原地扩展,它的新名字具有一定的封装性,以致于新命名的标识符具有更易定义变量的功能。请看上面第一大点代码的第三行:
typedef (int*) pINT;
#define pINT2 int*
效果相同?实则不同!实践中见差别:
pINT a,b;的效果同int *a; int *b;表示定义了两个整型指针变量。
而pINT2 a,b;的效果同int *a, b;表示定义了一个整型指针,一个整型变量
分享到:
相关推荐
四、思考与提高 假设两个顺序线性表 La 和 Lb 分别表示两个集合 A 和 B,如何实现 A=A∩B ? 五、代码实现 ```c #include #include #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define YES 1...
2.学会总结:通过实践和思考,了解算法的执行过程和结果,弄清“为什么”会得到这个结果,从而查漏补缺。 3.实践出真知:通过动手实践和编程,进一步加深对算法的理解,掌握算法的操作步骤和自身性质,并提高编程...
通过定义哲学家的状态(思考、饥饿、进食)以及引入互斥信号量和资源信号量来控制筷子的获取与释放,这种方法可以有效地避免死锁。 **状态定义**: - THINKING:表示哲学家正在思考。 - HUNGRY:表示哲学家感到饥饿...
typedef int semaphore //信号量是一个特殊的整型变量 int state[N] //记录每个人的状态 semaphore mutex=1; //设置信号量 semaphore s[N]; //每个哲学家一个信号量 void philosopher(int i) { while(true) //...
在面试或评估嵌入式程序员能力时,这些问题不仅能测试其对C语言的理解,还能考察其解决问题和思考复杂情况的能力。了解这些基本概念是成为一个成功嵌入式开发者的基石,同时,对嵌入式系统特有的限制和挑战的理解也...
10. 程序员和编译器之间的暧昧:这部分内容涉及编程工作的演进、程序员与编译器、CPU之间的关系,以及如何像编译器一样思考,更高效地编写和优化代码。 总结来说,这份专题精讲篇内容丰富,适合有一定编程基础但...
16.5 类型定义:typedef 16. 6 范例:高效的洗牌和发牌模拟程序 16.7 位运算符 16.8 位段 16.9 字符处理库 16.10 字符串转换函数 16.11 字符串处理库中的查找函数 16.12 字符串处理库中的内存函数 16.13 ...
16.5 类型定义:typedef 16. 6 范例:高效的洗牌和发牌模拟程序 16.7 位运算符 16.8 位段 16.9 字符处理库 16.10 字符串转换函数 16.11 字符串处理库中的查找函数 16.12 字符串处理库中的内存函数 16.13 ...
- 联合的初始化和枚举的定义:讨论了联合的使用和枚举类型与预处理器#define的区别。 3. 表达式: - 操作数和操作符的组合规则:包括后缀、前缀和赋值运算符的使用和区别。 - 表达式的求值顺序:介绍了序列点和...
通过本次实验,参与的学生不仅提高了编程能力,还学习到了如何更加系统地思考问题、解决问题的方法。在调试过程中遇到的问题促使学生更加细致地分析问题所在,从而有效地提升了编程技巧和问题解决能力。 #### C语言...
[头文件data.h] #define NULL 0 #define LEN sizof(STD) typedef struct { char xh[12]; /*学号*/ char xm[12]; /*姓名*/ char sxcj[5]; /*数学成绩*/ char cxsj[5]; /*程序设计成绩*/ char zf[5]; /*总分*/ struct...
- **暂停与继续**:在游戏中按特定键(如P键)可暂停游戏,再次按同样的键可继续游戏。 - **退出游戏**:玩家可以通过按指定键(如ESC键)来退出游戏。 ##### 2.5 性能考虑 程序中提到,游戏的运行性能可能会受到...
哲学家进餐问题是计算机科学中一个经典的并发控制问题,用于展示在多线程或多进程环境中资源竞争与死锁的问题。该问题设定如下:有五个哲学家围坐在一张圆桌旁,每个哲学家面前有一盘食物(假设为面条),而每两个...
#define STEP 0.02 // 采样间隔 typedef struct Voxel { float x; float y; float z; int value; } Voxel; vector<Voxel> VolumeData; // 体素数组 ``` - `STEP` 定义了采样间隔,即体素之间在每个维度上...
C语言中的基本数据类型包括整型(int)、浮点型(float和double)、字符型(char)以及布尔型(通常通过typedef定义)。变量是存储数据的内存单元,每个变量都必须先声明其数据类型,再进行赋值。 2. 运算符: ...
- **鼓励思考**:鼓励读者在独立思考后再参考答案,以提高学习效果。 - **错误反馈**:欢迎读者提出意见和建议,共同完善答案。 ### 具体习题解答分析 #### 1.16 按从大到小顺序输出三个数 该题要求实现一个函数`...
- **栈结构体**:`typedef struct {DataType data[StackSize]; int top; } MyStack;`,其中 `data` 是一个包含 `StackSize` 个 `DataType` 类型元素的数组,用来存储栈中的数据;`top` 是一个整型变量,表示栈顶位置...
同时定义了一个`typedef struct student STU;`,使得后续可以更简洁地使用`STU`代替`struct student`。 #### 三、全局变量与常量 - `#define PF printf`: 宏定义,将`printf`替换为`PF`,方便修改输出函数。 - `#...