Chinaunix首页 | 论坛 | 博客
  • 博客访问: 196824
  • 博文数量: 60
  • 博客积分: 3269
  • 博客等级: 中校
  • 技术积分: 648
  • 用 户 组: 普通用户
  • 注册时间: 2005-09-21 10:48
文章存档

2012年(6)

2011年(6)

2010年(30)

2009年(8)

2007年(6)

2005年(4)

我的朋友

分类: C/C++

2010-09-10 00:41:26

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;
表示定义了一个整型指针变量a和整型变量b。
 
const pINT p; // pINT是一种类型,这样p被锁住,不可更改,但p指向的内容可以更改。
const pINT2 p; // 相当于const int *p,锁的是指针指向的对象,所以p可以更改,但p指向的内容不可更改。
 
另一个重要差别是define是在预处理时进行的,typedef是在编译时处理的。我在一些代码中发现如下的问题。
typedef _ssize_t ssize_t;
 
#if !defined(ssize_t)
    typedef SSIZE_T ssize_t;
#endif
 
本意容易理解,但是却引发编译错误,提示ssize_t定义冲突,原因就是宏定义处理时,ssize_t还没有被定义呢。
 
================================================
#if defined等价于#ifdef; #if !defined等价于#ifndef。
 
#ifdef 和 #if defined 的区别在于,后者可以组成复杂的预编译条件,比如

#if defined (AAA) && defined (BBB)
xxxxxxxxx
#endif

#if defined (AAA) || VERSION > 12
xxxxxxxxx
#endif

而#ifdef 就不能用上面的用法,也就是说,当你要判断单个宏是否定义时
#ifdef 和 #if defined 效果是一样的,但是当你要判断复杂的条件时,只能用 #if
阅读(665) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~