【54】C++中的宏

在C++中使用预处理器来“宏”化某些操作,这样我们就不用了一遍又一遍地手动输入代码了,我们可以用预处理器来在某种程度上帮助我们实现自动化。当我们编译C++代码时,首先发生的事情是:预处理器会过一遍C++所有你看到的语句,它以#符号开头(预处理指令符号),当预处理器评估完代码之后,之后会把评估后的代码给到编译器,进行实际的编译以及其他操作。所以说预处理阶段基本上是一个文本编辑阶段,在这个阶段我们可以确定什么样的代码会实际递给编译器。

示例:

#include <iostream>

int main()
{
    std::cin.get();
}
#include <iostream>
#define WAIT std::cin.get()

int main()
{
    WAIT;
}

上面两种代码实现效果相同。

#include <iostream>

#define LOG(x) std::cout << x << std::endl

int main()
{
    LOG("Hello"); //std::cout << "Hello" << std::endl
    return 0;
}

在VS中,编译器有两种模式:debug和release;

在debug模式下,编译器不会进行优化,会保留宏;但是在release模式下,编译器则会消除宏,即宏不可见。

#include <iostream>

#define _DEBUG  //定义_DEBUG
#ifdef _DEBUG   //假如有定义
#define LOG(x) std::cout << x << std::endl //定义的操作
#else   //否则
#define LOG(x)  //定义空操作
#endif  //结束定义

int main()
{
    LOG("Hello");
    return 0;
}

以上代码在debug模式下可以实现宏定义,但是当切换到release模式下时,这个就被移除了,原因是在release模式下,在编译时,不会包含特定的代码(在前面已经为我们删除了宏定义的代码)。

#include <iostream>
#define _DEBUG 1
#if _DEBUG == 1
#define LOG(x) std::cout << x << std::endl
#elif defined(_RELEASE) //假如定义了_RELEASE的值为1(检测函数,检测括号里面的预定义是否存在,如果存在返回ture,不存在就返回false)
#define LOG(x)
#endif

int main()
{
    LOG("Hello");
    return 0;
}

使用#define _DEBUG 1相比#define _DEBUG,一方面可以不需要通过注释移除整个符号了或者直接删除符号,另一方面可以直接控制_DEBUG的值,可读性更好。

而且通过使用#if 0(配合#endfi)可以使得整个宏被禁用。

示例:使用反斜杆来写多行的宏

#include <iostream>

#define MAIN int main() \
{\
	std::cin.get();\
}

MAIN

以上代码用反斜杆来转义换行符,等价于:

#include <iostream>

int main()
{
   std::cin.get();
}

切记不能在反斜杠后面加空格,因为这样就会是对空格的转义,而不是换行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Balaaam

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值