1. 主页
  2. 文档
  3. C语言教程
  4. C语言预处理器
  5. typedef 与 C 中的#define

typedef 与 C 中的#define

typedef: typedef 用于给数据类型一个新名称。例如,

// C program to demonstrate typedef
#include <stdio.h>

// 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 <stdio.h>

// After this line HYD is replaced by
// "Hyderabad"
#define HYD "Hyderabad"

int main()
{
printf("%s ", HYD);
return 0;
}

输出:

Hyderabad

typedef 和 #define 的区别:

  1. typedef 仅限于为类型提供符号名称,而#define 也可用于定义值的别名,例如,您可以将 1 定义为 ONE,将 3.14 定义为 PI,等等。
  2. typedef 解释由编译器执行,其中#define 语句由预处理器执行。
  3. #define 不应以分号结尾,但 typedef 应以分号结尾。
  4. #define 只会在使用点复制粘贴定义值,而 typedef 是新类型的实际定义。
  5. typedef 遵循范围规则,这意味着如果在范围(函数内部)中定义了新类型,则新类型名称将仅在范围存在之前可见。在#define 的情况下,当预处理器遇到#define 时,它​​会替换所有出现的事件,之后(不遵循范围规则)。
// C program to demonstrate importance
// of typedef over #define for data types
#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;
}

输出:

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 字节。

这篇文章对您有用吗?