【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
__FILE__
__LINE__
__DATE__
__has_include
__cpp_modules
__cpp_decltype
__cpp_decltype_auto
_cpp_lib_make_unique
3.常用的条件编译形式:
#if 0
...
#endif
#if 1
...
#endif