【C++】二、预编译技巧

【C++】二、预编译技巧

 * 
 *   ┏┓   ┏┓+ +
 *  ┏┛┻━━━┛┻┓ + +
 *  ┃       ┃  
 *  ┃   ━   ┃ ++ + + +
 *  ████━████ ┃+
 *  ┃       ┃ +
 *  ┃   ┻   ┃
 *  ┃       ┃ + +
 *  ┗━┓   ┏━┛
 *    ┃   ┃           
 *    ┃   ┃ + + + +
 *    ┃   ┃
 *    ┃   ┃ +  
 *    ┃   ┃    
 *    ┃   ┃  +         
 *    ┃    ┗━━━┓ + +
 *    ┃        ┣┓
 *    ┃        ┏┛
 *    ┗┓┓┏━┳┓┏┛ + + + +
 *     ┃┫┫ ┃┫┫
 *     ┗┻┛ ┗┻┛+ + + +
 * 

简介

Author: louis

Email:louis.yyj.dev@foxmail.com

Description:学习和总结C++的预编译阶段技巧

Reference:

1.Chrona(罗剑锋).C++实战笔记[M].人民邮电出版社.2021.11.

一、预处理指令

参考格式:

#                             // 预处理空行
#if __linux__                 // 预处理检查宏是否存在
#    define HAS_LINUX  1      // 宏定义,有缩进
#endif                        // 预处理条件语句结束
#                             // 预处理空行

二、#include 包含文件

1.注意,#include是包含"文件",不是包含"头文件",即它可以把任何源码、文本、图片、音视频等包含进来,当然无法处理的错误是另外一回事了。

2.#include是非常弱的,不做什么检查,直接照搬照抄。

3.写头文件时为了放置重复包含,应加"Include Guard",即参照如下格式:

#ifndef _XXX_HPP_INCLUDE  // 检查是否定义了宏
#define _XXX-HPP_INCLUDE  // 没有的话,则定义宏

...                       // 内容

#endif                    // 结束定义

4.#include可以被用作包含一些大量数据,减少源码的编写空间,让代码更简洁:

例如一个数组中的内容包含了大量的数据:
static uint32_t calc_table[] = {
    0x00000000, 0x77073096, 0xee0e612c, 0x990951ba,
    0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
    ...
}

那么可以利用 #include 将这些数据单独形成文件后包含进来:

编写一个文件:calc_value.inc 
内容如下:
 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba,
 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
 ...

 使用 #include 方式包含进来:
 static uint32_t calc_table[] = {
    # include "calc_value.inc"
}

这样即让数组代码更加简洁,同时也实现了"源码级别的抽象"

三、#define 宏定义

1.#define可以说无所不能,所以使用时需要特别小心,切记宏定义满天飞,以免搞乱源码

2.宏没有作用域的概念,永远是全局生效,所以用完后尽快#undef:

做法1#define CUBE(a)  (a) * (a) * (a)      // 定义一个求立方的宏

cout << CUBE(10) << endl;             // 使用宏,简化代码
cout << CUBE(15) << endl;

#undef CUBE                           // 使用完毕后取消该宏定义

做法2#ifdef CUBE                           // 检查是否已经定义
#  undef CUBE                         // 取消定义
#endif                                // 结束检查

#define CUBE(a)  (a) * (a) * (a)      // 重新定义

3.宏定义常量的做法:

#define MAX_BUF_LEN   65535
#define VERSION      "1.0.18"

四、#if 条件编译

1.条件编译可以实现分支处理,即通过判断宏的数值来产生不同的源码,改变最终编译的源码形态。

2.一些特殊的预定义宏

__cplusplus           // 标记语言版本号(201703为C++17、202002为C++20)
__FILE__              // 源文件名
__LINE__              // 源文件行号
__DATE__              // 预处理时的日期
__has_include         // 是否存在某个可包含的文件
__cpp_modules         // 是否支持模块机制
__cpp_decltype        // 是否支持 decltype 特性
__cpp_decltype_auto   // 是否支持decltype(auto)特性
_cpp_lib_make_unique  // 是否提供函数make_unique()

3.常用的条件编译形式:

#if 0
 ...
#endif


#if 1
 ...
#endif
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值