一、typedef一般用来给类型取别名(type即类型)。如:
typedef struct Person{
char name[50];
int age;
} PersonNew;
此时下面3种定义对象的写法都正确:
Person person;
struct Person person;
PersonNew person;
或者用于函数指针,如:
typedef int (*FuncPtr)(int, int);
而#define是宏替换,一般用于常量、简单函数和条件编译,如:
//常量
#define MAX_NUM 100
//简单函数
#define PRINT_MSG(msg) printf("Message: %s\n", msg)
//条件编译
#define DEBUG_MODE
#ifdef DEBUG_MODE
// 在调试模式下执行的代码
#else
// 在发布模式下执行的代码
#endif
二、#define是预编译阶段直接进行,而typedef是编译阶段执行
#include <iostream>
using namespace std;
#define MyInt int
typedef int YourInt;
int main()
{
MyInt a = 0; //正确
YourInt b = 1; //正确
unsigned YourInt c = 2; //错误
return 0;
}
unsigned YourInt c的写法不行,是因为编译器读到unsigned后,先将unsigned看作一个类型了(和unsigned int同义),再编译到YourInt时,将它处理为int,此时就变成unsigned int int,所以报错。
三、使用#define定义指针时,容易犯“就近原则”的错误,但typedef不会。如下:
#include <stdio.h>
int main()
{
#define PCHAR char*
PCHAR a, b;
printf("sizeof(a) is %u, sizeof(b) is %u\n", sizeof(a), sizeof(b));
typedef char* PCHR;
PCHR c, d;
printf("sizeof(c) is %u, sizeof(d) is %u\n", sizeof(c), sizeof(d));
return 0;
}
在64位操作系统上的输出是:
sizeof(a) is 8, sizeof(b) is 1
sizeof(c) is 8, sizeof(d) is 8
说明a, c, d是指针,而b不是。