本篇文章根据自己对typedef以及#define的认识,通过提问加释义的方式,分享对这两个关键词的用法,了解其中未知内容同时在编程或者面试中避免不必要的错误。
作者: 飞哥;
1.例: typedef static int STINT; //是否 正确?
释义: 错误,typedef 本身是一种存储类的关键字,与auto、extern、mutable、static、register等关键字不能出现在同一个表达式中。
2.请用数组定义64字节的char数组?
释义: typedef char szName[64];
3.请用一句代码定义char 为CHAR以及其指针类型的PCHAR?
释义: typedef char CHAR,*PCHAR;
对于同一个表达式或字符串要定义为两个或两个以上的别名则需要用','分开;
同时,对于定义不同数据类型时,其类型符号,比如指针 '*' 要紧跟在别名前;
4.请问以下结构体定义是否正确,如果不正确请更正并写出结构体定义的其他方法;
typedef
struct
tagNode
{
char
* pItem;
pNode pNext;
}*pNode;
释义: 错误
实际上以上结构体定义要完成两步:
第一步是定义类型为tagNode的一个结构体:
struct
tagNode
{
char
* pItem;
pNode pNext;
};
而在构造结构体时,并不能找到pNode类型到底是什么,所以可以这么处理:
1)在定义前声明:
typedef struct tagNode *pNode; //将结构体tagNode定义为*pNode;
该操作类似上面,先声明tagNode为结构体,然后将其指针定义为pNode类型;
2)在结构体内部用已经定义的tagNode:
typedef
struct
tagNode
{
char
* pItem;
tagNode* pNext; //这里不能是pNode;
}*pNode;
即: 编译器支持用typedef给一个还未完全声明的类型起新名字;
5.#define PINT1 int *;
typedef int *PINT2;
请问: PINT1 a1,b1;
与
PINT2 a2,b2;
是否相同,如果不同请说明原因?
释义: 不同;b1被定义为int,而a1,a2,b2则被定义为int*;
#define定义后,编译器将定义项只是进行简单的文本替换,即:
int* a,b;
二typedef则是实实在在的将PINT2定义为了一种数据类型;其编译器编译的时候还是按照
类型表示符号进行的 : PINT2 a2,b2;
6. 下面程序是否有错误,找出错误行并说明原因?
typedef
char
*pStr;
char
string[4]=
"abc"
;
const
char
*p1=string;
const
pStr p2=string;
p1++;
p2++;
释义: 错误行出现在p2++中;
再次提醒,typedef在编译器中并不是进行简单的文本替换;
如果pStr被定义为: #define pStr char*;
则编译器会将 : const pStr p2 = string;直接替换为: const char* p2 = string;
此时没有任何问题(常量指针嘛,指针本身是可以改变的);
而这里用的是typedef,还是5知识点说过的,编译器编译的时候就认为pStr是一个类型,就像一个long类型一样,
它就是一个数据类型,类似: const long p2;这样是不是您就明白了?
如此一来,p2就变成了常量了,是不可以改变的;