17.define 和 typedef 的区别-灵析社区

菜鸟码转

二者之间的区别:

  • #define 作为预处理指令,在编译预处理时进行替换操作,不作正确性检查,只有在编译已被展开的源程序时才会发现可能的错误并报错。typedef 是关键字,在编译时处理,有类型检查功能,用来给一个已经存在的类型一个别名,但不能在一个函数定义里面使用 typedef 。
  • typedef 用来定义类型的别名,方便使用。#define 不仅可以为类型取别名,还可以定义常量、变量、编译开关等。
  • #define 没有作用域的限制,只要是之前预定义过的宏,在以后的程序中都可以使用,如果在 .cpp 文件中定义了宏,则在整个文件中都可以使用该宏,如果在 .h 文件中定义了宏,则只要包含该头文件都可以使用;而 typedef 有自己的作用域,如果在函数之外定义了类型,则在整个文件中都可以使用该类型定义,如果在函数内部定义了该类型,则只能在函数内部使用该类型。
  • 指针的操作:typedef 和 #define 在处理指针时不完全一样。比如以下程序:

C++

#include <stdio.h>
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;
}

输出为:

C++

sizeof a:8
sizeof b:8
sizeof c:8
sizeof x:8
sizeof y:1
sizeof z:1

由于在处理,typedef 定义了新的类型,因此变量 a, b, c 都属于指针类型,而 #define 只是做了简单的替换,被替换为语句 char *x, y, z 实际 y,z 为 char 类型。

阅读量:2009

点赞量:0

收藏量:0