天天看点

C++ typedef 与 define 浅析

【摘要】 本文主要分析比较typedef和define关键字,在概念与使用方法上相似处与差异。并给出typedef在结构体定义上应该注意的问题,define在使用上的值得改进的方向。详述如下。 【正文】

  • typedef
    • typedef 目的
在编程中使用typedef目的一般有两个,一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明。
    • typedef 定义
typedef 为C语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型 (struct等)。
    • typedef 使用形式
typedef   已有类型 新类型
1、typedef的最简单使用
typedef long byte_4; // 给已知数据类型long起个新名字,叫byte_4。
2、 typedef与结构结合使用
typedef struct tagMyStruct
 int iNum;
 long lLength;
} MyStruct;
这语句实际上完成两个操作:
1) 定义一个新的结构类型
struct tagMyStruct
 int iNum; 
 long lLength; 
};
分析:tagMyStruct 称为“tag”,即“标签”,实际上是一个临时名字,struct 关键字和tagMyStruct一起,构成了这个结构类型,不论是否有typedef,这个结构都存在。我们可以用struct tagMyStruct varName来定义变量,但要注意,使用tagMyStruct varName来定义变量是不对的,因为struct 和tagMyStruct合在一起才能表示一个结构类型。
2) typedef为这个新的结构起了一个名字,叫MyStruct。
typedef struct tagMyStruct MyStruct;
因此,MyStruct实际上相当于struct tagMyStruct,我们可以使用MyStruct varName来定义变量。
typedef struct {
int data;
int text;
} S1;//这种方法可以在c或者c++中定义一个S1结构
struct S2 {
int data;
int text;
};// 这种定义方式只能在C++中使用,而如果用在C中,那么编译器会报错
struct {
int data;
int text;
} S3; // 这种方法并没有定义一个结构,而是定义了一个s3的结构变量,编译器会为s3内存。
3、 typedef使用中应该注意的几个问题
首先,在C中定义 一个结构体类型要用typedef:
typedef struct Student
{
int a;
}Stu;
在声明变量的时候就可:Stu stu1;如果没有typedef就必须用struct Student stu1;来声明,这里的 Stu实际上就是struct Student的别名。另外这里也可以不写Student(于是也不能struct Student stu1;了)
typedef struct
{
int a;
}Stu;
但在c++里很简单,直接
struct Student
{
int a;
};
于是就定义了结构体类型Student,声明变量时直接Student stu2;
===========================================
其次,在c++中如果用typedef的话,又会造成区别:
struct Student 
int a; 
}stu1;//stu1是一个变量 
typedef struct Student2 
int a; 
}stu2;//stu2是一个结构体类型 
使用时可以直接访问stu1.a,但是,stu2则必须先 stu2 s2;然后 s2.a=10;
  • define
    • define的概念
宏定义,保存在预编译器的符号表中,执行高效;作为一种简单的符号替换,不进行其中参数有效性的检测
#define 宏名 要替换的代码      
本质:替换功能,define的东西在编译的时候会执行替换动作。
1.简单的#define定义“全局变量”
2.define的“函数定义”
3。宏的单行定义
4。取消宏#undef
5。为了避免重复包含(重复定义), 在一个.h文件开头会使用 #define ×××来定义。
    • define的使用
尽量以 const, enum, inline 替换 #define;
对单纯常量,最好以 const 对象 或 enums 替换 #define;
对于形似函数的宏 macros, 最好改用 inline 函数替换 #define。

继续阅读