12 个版本
0.2.1 | 2024 年 2 月 26 日 |
---|---|
0.2.0 | 2024 年 2 月 25 日 |
0.1.9 | 2024 年 2 月 19 日 |
0.1.8 | 2024 年 1 月 27 日 |
#417 in 命令行工具
25KB
598 行
single-header
一个用于生成可移植的 C/C++ 单头文件的 Rust 命令行工具
概述
此 Rust 程序旨在将 C/C++ 文件转换为可移植的单头文件。
- 通过在文件上运行 C 预处理器来处理 C/C++ 文件
- 使用
-fdirectives-only
选项调用 C 预处理器以限制系统特定的宏/包含 - 撤销所有系统头文件的
#include
扩展 - 通过依赖 gcc 预处理器输出文档 作为预期的预处理器输出来实现
- 将它们替换为尽可能接近原始的
#include
指令。 - 提供使用
#ifndef
或#pragma once
防止多次包含的保护。
局限性
- 所有预处理器条件(
#if
/#else
/#endif
)都将在系统头文件之外发生。唯一防止这种情况的方法是实现自定义的模拟 C 预处理器。
示例
对于以下项目
// test.hpp
#pragma once
#include "first.hpp"
void test() {}
// first.hpp
#pragma once
#include "second.hpp"
#include <cstddef>
void second_function() {}
// second.hpp
#pragma once
#include <type_traits>
void first_function() {}
将生成
$> single-header test.hpp
#ifndef TEST_HPP_SINGLE_HEADER
# define TEST_HPP_SINGLE_HEADER
#include <type_traits>
void first_function() {}
#include <cstddef>
void second_function() {}
void test() {}
#endif // TEST_HPP_SINGLE_HEADER
安装
使用 cargo 通过 crates.io
cargo install single-header
手动
git clone [email protected]:DaemonSnake/single-header.git
cd single-header
cargo install --path .
用法
Usage: single-header [OPTIONS] <FILE> [-- <CPP_OPTS>...]
Arguments:
<FILE>
path to c/c++ header file
[CPP_OPTS]...
additional parameters for the preprocessor
Options:
-p, --preprocessor <PREPROCESSOR>
[default: cpp]
[possible values: cpp, gcc, clang]
--cmake <CMAKE>
path to build folder to find the compile_commands.json file that contains how to compile <FILE>
-i, --inline <INLINE_PATH>
path / file that must allways be `#include` expanded (can provided multiple times)
-x, --lang <LANG>
[default: c++]
[possible values: c, c++]
--protect <PROTECTION>
protect against multiple includes with `#ifndef` or `#pragma once`
[default: ifndef]
[possible values: ifndef, once]
-h, --help
Print help (see a summary with '-h')
要求
- Rust
- 至少一个 C 预处理器
cpp
、gcc
或clang
依赖项
~6–16MB
~224K SLoC