优雅地使用#include

 原创    2022-01-05

#include并不只是用来引用头文件的,合理的使用#include可以让代码更优雅。

通常我们都是使用#include包含头文件,如下:

#include <stdio.h>

理解下#include的作用就是在预编译阶段将指定的文件原样拷贝到引用的地方。实际上还可以使用#include优雅的处理一些逻辑。

引用代码块

假设有一个C文件,里面包含不同的代码块。我们希望通过宏开关的方式控制不同代码块的打开关闭,但我们又不想将这些代码块都写在这个C文件中(可能导致C文件很长)。此时,就可以通过将代码块拆分到不同的文件中,并通过#include的方式引用。如下:

#ifdef KANCHUAN_COM_BLOCK_A
#include "A.inc"
#endif

#ifdef KANCHUAN_COM_BLOCK_B
#include "B.inc"
#endif

这里的A.inc和B.inc都是普通的C文件,这里只所以命名为inc后缀,是为了隐式地表明它不是一个普通的C文件:在A.inc被#include后,就不能直接把A.inc添加到源码文件中参与link,否则在链接时会提示符号重复。当然文件后缀名称可以任意修改。

引用本地文件

大型项目常常伴随着自动化构建。一个典型的场景是自动化脚本计算好版本号、时间戳等信息并写入文本文件,C程序通过#include的方式引入,不限于常量数值、常量字符串、结构体等。

include数值文件

uint64_t kanchuan_timestamp = {
    #include "file/kanchuan_timestamp.txt"
};

include字符串文件

const char *kanchuan_version = {
    #include "file/version.txt"
};

include结构体文件

file/kanchuan_struct.txt文件内容如下:

{"iOS", "https://kanchuan.com/blog/tag/iOS"},
{"GIT", "https://kanchuan.com/blog/tag/Git"},

使用#include引用:

typedef struct _Item {
    string name;
    string url;
} Item;

const Item items[] = {
    #include "file/kanchuan_struct.txt"
};

相关文章:

gcc function __attribute__
C库中strlen的源码实现

发表留言

您的电子邮箱地址不会被公开,必填项已用*标注。发布的留言可能不会立即公开展示,请耐心等待审核通过。