1.typedef是为原有类型声明一个新的名字,“typedef int* PINT_TYP ”就是声明了一个新的数据类型,数据类型名为PINT_TYP,其功能与
int *
是完全一样的,也就是说,PINT_TYP与int *
本质上完全相等(在程序中遇到PINT_TYP不是简单地替换)。而“#define PINT_DEF int*”是简单的宏定义,在预处理阶段就已经将PINT_DEF替换为
int *
了,它与int *
不等价(只是表面的特征相同)。例如:
#include<stdio.h>
#define PINT int*
typedef int*SINT
void main
{
int *a1,*b1,*c1; 说明:
PINT a2,b2,c2; int*在这里只修饰a2,而b2,c2只是两个int型变量
SINT a3,b3,c3;
PINT_TYP a3, b3, c3; <==> int *a3, *b3, *c3; 定义了三个指针
return 0;
}
二者修饰指针类型时,作用不同。
- typedef int * pint;
- #define PINT int *
- int i1 = 1, i2 = 2;
- const pint p1 = &i1; //p不可更改,p指向的内容可以更改,相当于 int * const p;
- const PINT p2 = &i2; //p可以更改,p指向的内容不能更改,相当于 const int *p;或 int const *p;
#define和#undefine的用法
#undef将保持已定义状态且在
作用域内,直到程序结束或者使用#undef 指令取消定义。
预处理器
在此程序中,我们将取消在先前程序中对预处理器的定义。
1
2
3
4
5
6
7
8
9
10
11
#include <iostream.h>
#include<string.h>
#define MAX 5
#undef MAX
void main()
{
char name[MAX]="abcd"; //只能用abcd,否则会提示说超出长度,原因是由于"\0"字符
cout<<"MAX = "<<MAX<<endl;
for(int i=0;i<MAX;i++)
cout<<name<<" "<<endl;
}
得到如下错误消息:
未定义符号 'MAX'
初始值设定项太多
在此程序中对 MAX 定义后又取消了定义。编译该程序时报错。由于未定义 MAX,char name[MAX] 的数组大小不可用,因此编译器发出第二个错误消息。