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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值