typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。
在编程中使用typedef目的一般有两个,一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明。
define为宏定义,它可以用来定义一个常量,常量的值为字符串或者数字,不可再更改。
define可以用作定义无参或者有参运算式,定义时运算式要加括号,否则会出错误。
define只是简单的文本替换
typedef是给一个类型重命名
当我们定义指针的时候,typedef要比define有优势
define工作在预编译时,进行简单的文本替换
define定义时,如果涉及到运算式,需要用括号括起
for example:
define f(x) ((x)*(x))
typedef工作在编译时,将数据类型重名命
typedef可以命名复杂的数据类型,我们常见的结构体类型,就常常和typedef结合起来使用
for example:
typedef struct tagMyStruct
{
int iNum;
long lLength;
}MyStruct;
实际上执行两个操作,一个是定义了结构体tagMyStruct,注意这是一个临时的名字
struct tagMyStruct
{
int iNum;
long lLength;
};
而typedef为这个结构体起了一个新名字
typedef struct tagMyStruct MyStruct;
如果我们要定义指针
typedef char* pStr1;
#define pStr2 char*
pStr1 s1,s2;
pStr2 s3,s4;
在这里,s1,s2,s3都被定义为char*,s4为char类型,正确的写法应该是
pStr2 s3,*s4;
还有一例:
typedef char *pStr;
char string[4]="abc";
const char *p1=string;
const pStr p2=string;
p1++;
p2++;
如果我们执行会报错
$ gcc typedef_pointer.c -o typedef_pointer
typedef_pointer.c: In function ‘main’:
typedef_pointer.c:11:5: error: increment of read-only variable ‘p2’
p2++;
^
这是因为p2是一个只读常量,它是不可变的。const用于限定一个变量为只读变量(和常量的概念不同),const char* p1限定了p1指针为只读,*p1不可改变,但是p1是可以变的,故p1++不报错。
const pStr p2并不等于const char * p2,和pStr const p2作用相同,它限定了p2是只读变量,只不过类型是我们自己定义的pStr,故p2++报错。
const type M,这句话表明M被限定为只读变量,不可当常量使用,这是ANSI C的标准,与C++标准有不同之处。