typedef与#define和const的用法区分

来源:互联网 发布:路由器信号增强软件 编辑:程序博客网 时间:2024/05/20 15:12

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++标准有不同之处。

原创粉丝点击