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
阅读(678) | 评论(0) | 转发(0) |