C++ 编译宏的一些符号

目前正在学习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";*/

待补充……

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值