在代码中使用宏定义比较方便,提高程序的运行效率,增加健壮性和方便性。
编译器会在预编译的时候进行简单的宏替换。
1、利用define来定义数值宏常量
利用define来定义数值类型的数据,一般只是用来定义 常量 ,如果 要定义一些变量,则可以使用c语言中const这个关键字。
const 修饰的数据是有类型的,而define 宏定义的数据没有类型。为了安全,我建议你以后在定义一些宏常数的时候用const代替,编译器会给const 修饰的只读变量做类型校验,减少错误的可能。
const修饰的不是常量而是readonly 的变量,const 修饰的只读变量不能用来作为定义数组的维数,也不能放在case 关键字后面。
2、利用define来定义字符串宏常量
经常利用define来定义路径,路径太长的话,可以使用反斜杠接续符,反斜杠作为接续符时,在本行其后面不能再有任何字符,空格都不行。所以,只有最后一个反斜杠才是接续符。
#define TEST_STRING "sfdfsfsfsf\
gdsdfsf"
3、利用define来定义注释符号
#define BSC //
#define BMC /*
#define EMC */
BSC Test line
BMC Another test line EMC
注释先于预处理指令被处理,当这三个宏定义被替换的时候,注释已经处理完毕。
4、利用define来定义表达式
#define SQR(x) x*x
假设x的值是表达式3+1,SQR(x)会被替换为3+1*3+1。出现错误。
因此定义表达式的时候,最好不要省略最外层括号。
正确定义:
#define SQR(x) ((x)*(x))
宏函数被调用时以实参替换形参,而不是“值传递”。
5、宏定义中的空格
#define ADD (x) ((x) + (x))
由于ADD和(x)之间有空格,宏定义不是我们想要的结果,表示定义了一个ADD,其代表的是(x) ((x) + (x))。
在定义宏函数的时候,注意空格的位置,而在使用宏函数的时候,空格会被编译器忽略。
6、#undef的使用
#undef是用来撤销宏定义的。
#define ADD(x) ((x) + (x))
//code
#undef ADD
//宏定义ADD被撤销,下面的代码不能用ADD了。
7、特殊字符串的使用
##表示连接。
#@表示转化为字符,加单引号。
#表示转化为字符串,加双引号。
代码如下:
#include <iostream>
using namespace std;
#define Connect(x,y) x##y
#define ConvertToChar(x) #@x
#define ConvertToString(x) #x
void main()
{
char* pTest1 = Connect("abcd", "efg"); // 结果是pTest1 = "abcdefg"
char test = ConvertToChar(1); // 结果是test = '1';
char* pTest2 = ConvertToString(123456); // 结果是pTest2 = "123456";
cout << pTest1 << endl;
cout << pTest2 << endl;
cout << test << endl;
system("pause");
}
执行结果如下: