宏定义
作用范围:定义行后的语句块,可以是全局变量或局部变量
本质:宏替换(在程序中使用宏名,在预处理(或预编译)时期进行内容替换)
好处:
1、提高可读性
2、对一些简单的函数进行宏定义,无需函数调用,运行效率高。
3、 可维护性好
define中的三个特殊符号
1、##。
宏定义:#define Conn(x,y) x##y
x,y的连接,可以返回int/浮点类型的数据(不能连接两个浮点数),也可以连接变量

1 ... 2 3 #define ADD_TO_ax(x,val) a##x += val 4 5 int main() 6 { 7 int a1 = 0; 8 ADD_TO_ax(1, 5); 9 cout<<a1; 10 return 0; 11 }
2、#@
宏定义:#define ToChar(x) #@x
返回const char类型字符,x只能是单个字符,否则编译器报错或返回最后一个字符
3、#
宏定义:#define ToString(x) #x
返回const char *类型,即“x”
注意:三种宏定义括号中的变量名全为常量,不能表示变量

1 #include <iostream> 2 using namespace std; 3 4 #define Conn(x,y) x##y 5 #define ToChar(x) #@x 6 #define ToString(x) #x 7 8 int main() 9 { 10 float a = Conn(1.1, 2); 11 char ch = ToChar(e); 12 ch = 'a'; 13 char *s = ToString(ch);//括号中部分默认为常量 14 cout << a << endl << ch << endl << s << endl; 15 return 0; 16 }
常见的宏定义:
1、防止头文件被重复包含

1 #ifndef BODYDEF_H 2 #define BODYDEF_H 3 4 //头文件内容 5 6 #endif
2、得到指定地址的一个字节或字
宏定义:
#define MEM_B(x) (*((byte*)(x)))
#define MEM_W(x) (*((WORD*)(x)))

1 ... 2 3 #include <Windows.h> 4 5 #define MEM_B(x) (*((byte*)(x))) 6 #define MEM_W(x) (*((WORD*)(x))) 7 8 int main() 9 { 10 int test = 0x11221221; 11 byte m = MEM_B(&test);//得到一个字节内容,0x21 12 int n = MEM_W(&test);//得到一个字的内容,0x1221 13 printf("0x%x\n", m); 14 printf("0x%x\n", n); 15 printf("%d\n", m);//2*16+1=33 16 return 0; 17 }
3、字母字符大小写转换
#define UPCASE(ch) ( ( ch<='Z' && ch>='A' )?(ch - 0x20):ch ) //将字符变量ch转为大写
#define LOWCASE(ch) ( ( ch<='Z' && ch>='A' )?(ch + 0x20):ch ) //将字符变量ch转为小写

1 ... 2 3 #define UPCASE(ch) ( ( ch<='z' && ch>='a' )?(ch - 0x20):ch ) //将字符变量ch转为大写 4 #define LOWCASE(ch) ( ( ch<='Z' && ch>='A' )?(ch + 0x20):ch ) //将字符变量ch转为小写 5 int main() 6 { 7 char *s = "Hi,Adam",*p; 8 char str[10]; 9 for (p = s; *p != '\0'; p++) 10 str[p - s] = UPCASE(*p); 11 str[p - s] = '\0'; 12 cout << str << endl; 13 cout << "-----------------" << endl; 14 cout << UPCASE('a') << endl; 15 cout << "-----------------" << endl; 16 char ch = 'a'; 17 ch = UPCASE(ch); 18 cout << ch << endl; 19 return 0; 20 } 21 22 ...
4、判断字符是不是n进制的
#define DECCHK_CHAR(ch) ( ch<='9' && ch>='0' ) //判断字符是否是10进制
#define OCTCHK_CHAR(ch) ( ch<='7' && ch>='0' ) //判断字符是否是8进制
#define HEXCHK_CHAR(ch) ( (ch<='9'&&ch>='0')||(ch<='f'&&ch>='a')||(ch<="F"&&ch>='A') ) //判断字符是否为16进制

1 ... 2 3 //判断n进制 4 #define DECCHK_CHAR(ch) ( ch<='9' && ch>='0' ) 5 #define OCTCHK_CHAR(ch) ( ch<='7' && ch>='0' ) 6 #define HEXCHK_CHAR(ch) ( (ch<='9'&&ch>='0')||(ch<='f'&&ch>='a')||(ch<="F"&&ch>='A') ) 7 8 int main() 9 { 10 char ch = '2'; 11 cout << DECCHK_CHAR(ch) << endl; 12 cout << DECCHK_CHAR(3) << endl;//错误写法,"形参"是char类型方可 13 return 0; 14 }
5、得到数组的大小
#define ARR_SIZE(a) ( sizeof( a )/sizeof( a[0] ) )

1 ... 2 3 #define ARR_SIZE(a) ( sizeof( a )/sizeof( a[0] )) 4 5 int main() 6 { 7 char a[3]; 8 cout << ARR_SIZE(a); 9 return 0; 10 }