define 和 typedef 的比较

最近工作中遇到一个问题,加深了我对define和typedef之前区别的认识,特此记录。
问题:pclint检查到一个指针变量,没有使用该指针去直接改写其指向的内存的情况,因此建议使用const修饰。

特别地,该指针类型是用typedef定义的。
typedef void * HANDLE
HANDLE var;

按照pclint给的建议,本能的改成了 const HANDLE var; 此时编译报错为var是一个只读变量。但是如果直接写成const void * var,则不会报这个问题。

也就是以下两个写法并不等价。
const HANDLE var;
const void * var;

但是如果换作define,也毫无问题。
#define MACRO_HANDLE (void *)
const MACRO_HANDLE var;

通过上述的问题,进而引出define和typedef真正的区别。
typedef:
1.tyedef是C语言中预留的关键字,和 int/struct/const等关键字是一类。
2.顾名思义,typedef = type define, 它是定义一种新类型的方法,也就是说经过typedef void * HANDLE;之后,HANDLE是一个新的类型,作为指针标识的*在其定义内部,对外是不再体现的。此时的const HANDLE var;和const int var;效果相同,直接把var定义成常量了。

define:
1.define是编译器的预处理指令,和#ifndef/#endif这类指令是一类。
2.define的作用只是纯粹的字符串替换,它的作用只是做给编译器看的,在预编译结束时,宏替换完成。此时代码中的const MACRO_HANDLE var;已经被编译器改成了const void * var;所以之后编译时,自然没有问题了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章