C语言type 与 #define 定义区别
发布网友
发布时间:2022-05-01 22:22
我来回答
共5个回答
热心网友
时间:2022-06-24 07:30
#define仅仅是编译前期的预处理过程中进行源代码中的字符串替换,不参与之后的翻译期语法检查。
typedef定义的类型别名会被静态类型系统检查,如果发现了用未定义的类型来定义新的类型,会明确地产生编译错误。
此外,typedef的语法允许定义复杂的类型(和用这些类型定义这些类型的对象一致,只不过前面加typedef,定义的是类型名而不是对象名),例如
typedef struct node_
{
int dat;
struct node* next;
} node;
typedef int array_type[10];
typedef void(*func_ptr)(int);
由于预处理器和上述复杂类型的语法(语序)的*,#define无法简单地做到定义这些类型。
由于指针定义语法的特殊性,宏替换还有个陷阱,就是关于指针说明符的*,在定义时需要出现在每一个指针项上,而宏定义无法做到让一个宏记录类型信息,于是用这个类型定义对象时就可能产生错误:
#define INT_PTR int*
typedef int* int_ptr;/*说明指针类型的星号可以紧接int或int_ptr或两者,或都隔开若干空格,这里强调int*表示一整个类型。*/
INT_PTR a, b; /*展开后为 int* a, b;注意b是int,不是指针。*/
int_ptr c, d; /*c和d都是int*类型,即指向int的指针。*/
====
[原创回答团]
参考资料:原创
热心网友
时间:2022-06-24 07:30
#define仅仅是编译前期的预处理过程中进行源代码中的字符串替换,不参与之后的翻译期语法检查。
typedef定义的类型别名会被静态类型系统检查,如果发现了用未定义的类型来定义新的类型,会明确地产生编译错误。
此外,typedef的语法允许定义复杂的类型(和用这些类型定义这些类型的对象一致,只不过前面加typedef,定义的是类型名而不是对象名),例如
typedef struct node_
{
int dat;
struct node* next;
} node;
typedef int array_type[10];
typedef void(*func_ptr)(int);
由于预处理器和上述复杂类型的语法(语序)的*,#define无法简单地做到定义这些类型。
由于指针定义语法的特殊性,宏替换还有个陷阱,就是关于指针说明符的*,在定义时需要出现在每一个指针项上,而宏定义无法做到让一个宏记录类型信息,于是用这个类型定义对象时就可能产生错误:
#define INT_PTR int*
typedef int* int_ptr;/*说明指针类型的星号可以紧接int或int_ptr或两者,或都隔开若干空格,这里强调int*表示一整个类型。*/
INT_PTR a, b; /*展开后为 int* a, b;注意b是int,不是指针。*/
int_ptr c, d; /*c和d都是int*类型,即指向int的指针。*/
====
热心网友
时间:2022-06-24 07:30
typedef和宏它们针对的软件都不一样.
宏是预处理器的任务, 比如说:#define A 10, 预处理器在读取这行后, 它会把程序以后的所有大写字母A都替换成10(需要全字匹配). 我们写的代码必须通过预处理器处理后, 才会被编译器编译.
而typedef是针对的编译器, 不是预处理器的任务. 编译器读取typedef unsigned int UINT;后, 它会在以后的代码中, 认为UINT就是unsigned int, 也就是说对编译器来讲又多了一种数据类型, 但是这种数据类型和unsigned int是一样的.
热心网友
时间:2022-06-24 07:31
宏定义只是简单的字符串代换,是在预处理完成的,而typedef是在编译时处理的,它不是作简单的代换,而是对类型说明符重新命名。被命名的标识符具有类型定义说明的功能。
#define PIN1 int *
typedef (int *) PIN2;
从形式上看这两者相似, 但在实际使用中却不相同。
下面用PIN1,PIN2说明变量时就可以看出它们的区别:
PIN1 a,b;在宏代换后变成:
int *a,b;
表示a是指向整型的指针变量,而b是整型变量。
然而:
PIN2 a,b;
表示a,b都是指向整型的指针变量。因为PIN2是一个类型说明符。由这个例子可见,宏定义虽然也可表示数据类型, 但毕竟是作字符代换。在使用时要分外小心,以避出错。
热心网友
时间:2022-06-24 07:32
typedef是创建一个别名
而
#define是宏~ 只是做文本替代作用.. 而且宏必定被执行,除非在宏上做判断