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:以上代码不可直接运行

posted @ 2025-04-22 10:15  菜鸟升级日记  阅读(79)  评论(0)    收藏  举报