#header-file #cc #single #single-file #preprocessor #generate #command-line-tool

app single-header

一个用于生成可移植的 C/C++ 单头文件的 Rust 命令行工具

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 预处理器 cppgccclang

依赖项

~6–16MB
~224K SLoC