您的位置:首页 > 编程语言 > C语言/C++

C++ typedef 与 define 浅析

2015-07-12 21:55 148 查看
【摘要】
本文主要分析比较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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: