目前正在学习C++宏内容
C++的宏真的比较巧妙,本来以为一两个小知识点可以记下来,但是在查找资料的时候发现了很多以前没有注意到的地方,用来记录一下,以免后续文档丢失,先记录在网站种。
1、宏定义:
#define <宏名> <字符串>
宏一般用来标识代码中可以重复大量出现的内容。
T1:个人理解是在编译之前,编译器会将代码中所有包含<宏名>的位置替换为<字符串>,后续再进行语义解释。相当于将文件中的某一文字,全部替换为指定的文字。
例子:#define PI 3.1415926
circle_area(int r){return PI*(r*r);} => circle_area(int r){return 3.1415926*(r*r);}
2、带参数的宏定义
#define <宏>(参数表) 宏体
T1:个人理解是二次替换,先将参数表中的参数替换到宏体中,再将宏整体替换到代码文本中。
例子:#define A(x) (x+x)
dub_x_quadratic(char x){return A(x)*A(x);} => dub_x_quadratic(char x){return (x+x)*(x+x);}
注意,这里如果宏类似:
#define A(x) x+x
那么对应的会变成
dub_x_quadratic(char x){return A(x)*A(x);} => dub_x_quadratic(char x){return x+x*x+x;}
这就是差别所在
但是如果这样调用 dub_x_quadratic(2*2),等价于A(2*2)*A(2*2)=>(2*2+2*2)*(2*2+2*2)。
3、续航符反斜杠\
宏定义过长时,因为宏定义规定需要一行写完,这时候如果过长可以使用续行符,C++续行符是反斜杠\。
比如
#define BASIC_CONSTRUCTION(OBJECT) public:OBJECT::OBJECT(); ~OBJECT::OBJECT();
//其他例子
#define SomeFun(x, a, b) if(x)x=a+b;else x=a-b;
可以这样写:
#define BASIC_CONSTRUCTION(OBJECT)\
public:\
OBJECT::OBJECT();\
~OBJECT::OBJECT();
//
#define SomeFun(x, a, b)\
if (x)\
x = a + b;\
else\
x = a - b;
当然,续行符还有其他的用法,下面这种情况一般编译器默认自动添加续航符。
int i,j;
cout<<i
<<"测试"<<j<<endl;
但是写成下面这种就不行
int i,j;
cout<<i<
<"测试"<<j<<endl;
这种情况可以使用续航符
4、宏体中的#
#define ToString(x) #x
这种情况则str=ToString(123456)等价于str="123456"
5、宏体的#@
#define ToChar(x) #@x
这种情况则ch=ToChar(12)等价于ch='12';
6、宏体中的##
#define Conn(x,y) x##y
//
int n = Conn(123,456); /* 结果就是n=123456;*/
char* str = Conn("asdf", "adf"); /*结果就是 str = "asdfadf";*/
待补充……