📜  C中的typedef与#define

📅  最后修改于: 2021-05-26 02:27:21             🧑  作者: Mango

typedef :typedef用于为数据类型赋予新名称。例如,

// C program to demonstrate typedef
#include 
  
// 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 
  
// 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 
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个字节。

想要从精选的最佳视频中学习和练习问题,请查看《基础知识到高级C的C基础课程》。