typedef :typedef用于为数据类型赋予新名称。例如,
// C program to demonstrate typedef
#include
// After this line BYTE can be used
// in place of unsigned char
typedef unsigned char BYTE;
int main()
{
BYTE b1, b2;
b1 = 'c';
printf("%c ", b1);
return 0;
}
输出:
c
的#define在C是用来#定义别名指令。
// C program to demonstrate #define
#include
// After this line HYD is replaced by
// "Hyderabad"
#define HYD "Hyderabad"
int main()
{
printf("%s ", HYD);
return 0;
}
输出:
Hyderabad
typedef和#define之间的区别:
- typedef仅限于为类型赋予符号名称,而#define也可以用于定义值的别名,例如,您可以将1定义为ONE,将3.14定义为PI等。
- typedef解释由编译器执行,其中#define语句由预处理器执行。
- #define不应以分号终止,而typedef应当以分号终止。
- #define只会在使用时复制粘贴定义值,而typedef是新类型的实际定义。
- typedef遵循作用域规则,这意味着如果在作用域内(在函数内部)定义了新类型,则只有在作用域存在之前,新类型名称才可见。在#define的情况下,当预处理器遇到#define时,它将替换所有出现的事件(此后不遵循作用域规则)。
// C program to demonstrate importance
// of typedef over #define for data types
#include
typedef char* ptr;
#define PTR char*
int main()
{
ptr a, b, c;
PTR x, y, z;
printf("sizeof a:%zu\n" ,sizeof(a) );
printf("sizeof b:%zu\n" ,sizeof(b) );
printf("sizeof c:%zu\n" ,sizeof(c) );
printf("sizeof x:%zu\n" ,sizeof(x) );
printf("sizeof y:%zu\n" ,sizeof(y) );
printf("sizeof z:%zu\n" ,sizeof(z) );
return 0;
}
输出:
sizeof a:8
sizeof b:8
sizeof c:8
sizeof x:8
sizeof y:1
sizeof z:1
从作为指针的上述程序大小“ a”的输出来看,其值为8(在使用8字节存储指针的机器上)。在上面的程序中,当编译器进入
typedef char* ptr;
ptr a, b, c;
该语句实际上变为
char *a, *b, *c;
这将a,b,c声明为char *。
相反,#define的工作方式如下:
#define PTR char*
PTR x, y, z;
该语句实际上变为
char *x, y, z;
这使x,y和z不同,因为x是指向char的指针,而y和z是char变量。当我们在定义是否声明多个标识符的同时使用指针声明宏时,则将实际定义赋予第一个标识符,然后为其余非指针定义给出。在上述情况下,x将被声明为char *,因此其大小为指针的大小,而y和z将被声明为char,因此其大小将为1个字节。
想要从精选的最佳视频中学习和练习问题,请查看《基础知识到高级C的C基础课程》。