typedef: (http://www.cnblogs.com/kerwinshaw/archive/2009/02/02/1382428.html)
用法:
1.定义一个类型别名,便于直观识别,另外注意不是简单的宏替换,如下:
typedef PTD1 int*;
#defien PTD2 int*
PTD1 a,b;
PTD2 a,b; 区别是第一行相当于int*a;intb;(即int*a,b;),第二行相当于int*a;int*b;。
2.与结构体公用体定义配合使用,例如:
typedef struct
{
int a;
char b[10];
int*c;
}SYS_PARA_QDIES;
SYS_PARA_QDIES Sys_Para_Qdies1,Sys_Para_Qdies2;
3.定义一个与平台无关的类型,便于移植。如:
typdef real double long;
typdef real long; 不同的平台移植完成后仅更改typedef后定义即可,#defien也能完成此功能,但是相较于define,typedf更稳健。
用法陷阱:(没看懂第一个)
陷阱一:
记住,typedef是定义了一种类型的新别名,不同于宏,它不是简单的字符串替换。比如:
先定义:
typedef char* PSTR;
然后:
int mystrcmp(const PSTR, const PSTR);
const PSTR实际上相当于const char*吗?不是的,它实际上相当于char* const。
原因在于const给予了整个指针本身以常量性,也就是形成了常量指针char* const。
简单来说,记住当const和typedef一起出现时,typedef不会是简单的字符串替换就行。
陷阱二:
typedef在语法上是一个存储类的关键字(如auto、extern、mutable、static、register等一样),虽然它并不真正影响对象的存储特性,如:
typedef static int INT2; //不可行
编译将失败,会提示“指定了一个以上的存储类”。
#define ( http://www.cnblogs.com/Jency/articles/C_Cplusplus_define.html)
用法
1.简单的#define 定义
例如: #defien max 100
仅仅是文本替换,在预编译过程中起作用,不做安全检查,注意与const常量的区分。
2.#defien的函数定义
例如: #defien max(x,y) ((x)>(y)?(x):(y))
#defien ADD(x,y) ((x)+(y))
注意用括号分层,防止在使用时出现 c*ADD(a,b)*d的情况。 再一次说明#define仅仅是文本替换。
3宏定义函数语句
例如:注意多行时换行加\,代表宏定义还未结束。
#define BLUETOOTH_UART_PIN_PRESLEEP() \
do{ \
STM32_GPIO_InitTypeDef GPIO_InitStruct; \
GPIO_InitStruct.Pin = STM32_GPIO_PIN_9|STM32_GPIO_PIN_10; \
GPIO_InitStruct.Mode = STM32_GPIO_MODE_ANALOG; \
GPIO_InitStruct.Pull = STM32_GPIO_NOPULL; \
STM32_GPIO_Init(GPIOA, &GPIO_InitStruct); \
} while(0)
4.条件编译
#ifdef (标识)
程序段
#else
程序段
#endif
5.头文件的包含使用
#ifndef AAA
#define AAA
#ifndef D20_READ_MET_APP_H
#define D20_READ_MET_APP_H
防止多次引用,导致重复定义的错误。
注意点:
1.#define 是全局有效。typedef 是本文件从定义处开始有效。
const
用法:
1.