typedef与define的异同
相同点:
typedef与define都可以用来取别名。
不同点:
1.作用原理不同
typedef用作为已存在的数据类型取别名,且用别名定义变量时,所有变量的类型均为该类型。
define用作为所有已有的对象起别名,不同的是,使用别名时,仅是单纯对别名进行展开。
示例:
typedef char * mytype_typedef
#define mytype_define char *
mytype_typedef pa1, pb1; //pa1,pb1的类型均为char *
mytype_define pa2, pb2; //pa2的类型为char *,pb2的类型为char
pa1与pb1的类型均为char *比较好理解,此处不作赘述。pb2的类型与pa2的不一致,造成这一现象的原因在于,define定义的别名在预处理阶段被展开,展开后如下:
char *pa2, pb2;
因此pa2被定义为char *类型,而pb2被定义为char类型。
2.处理阶段不同
typedef是在编译阶段被处理。
define是在预处理阶段被处理。
3.作用域不同
typedef若在函数外定义,则其作用域为定义处至文件结尾。
typedef若在函数内定义,则其作用域为定义处至函数结尾。
define作用域为定义处至函数结尾,不分函数内外。
示例:
/* main.c */
#include <stdio.h>
typedef char mytype_typedef; /* 用typedef给char取一个别名mytype_typedef */
#define mytype_define char /* 用define给char取一个别名mytype_define */
/* 在函数内用typedef将mytype_typedef定义为int的别名 */
void func_with_typedef()
{
typedef int mytype_typedef;
mytype b = 0x1234;
printf("b = %d\n", b);
}
/* 运行结果
* b = 4660
* 在函数内,mytype_typdef被重定义为int的别名,其定义的变量为int类型。
* 函数结束后,其作用域结束,重新指向全局的mytype_typedef,即为char的别名。
*/
void func_without_typedef()
{
mytype a = 0x1234;
printf("a = %d\n", a);
}
/* 运行结果
* a = 52
*/
/* 在函数内将用define将mytype_define定义为int的别名 */
void func_with_define()
{
#define mytype_define int /* 报错,提示mytype_define被重复定义 */
mytype_define d = 0x1234;
printf("d = %d\n", d);
}
/* 运行结果
* 无法运行
*/
void func_without_define()
{
mytype_define c = 0x1234;
printf("c = %d\n", c);
}
/* 运行结果
* c = 52
*/
int main()
{
func_without_typedef();
func_with_typedef();
func_without_define();
func_with_define();
return 0;
}
PS:以上代码不可直接运行
浙公网安备 33010602011771号