【问题标题】:Import a text file to std::string at complie time在编译时将文本文件导入 std::string
【发布时间】:2020-08-20 17:59:24
【问题描述】:

Google 充满了 C 风格的答案。我正在寻找 std::string 方法来完成这项任务

【问题讨论】:

  • 你还不能在 C++ 编译时读取文件。
  • @cigien 但我在这里看到了stackoverflow.com/questions/19638557/… 的答案,它说 C++ 可以使用预处理器来做到这一点,但我不确定如何。答案作者是 James Kanze。
  • 即使您预处理文件并将结果放入 std::string foo = "file content"; 中,您也无法生成 foo constexpr,因为这仅允许用于文字类型。
  • 为什么需要这个?您需要解决的实际问题是什么?
  • 您可以创建一个对象,其类构造函数在运行时读取您的文件,然后 main() 中的任何代码运行。您可以 #include 具有带引号的字符串常量的文件来初始化字符串变量,如 MACRO、全局或静态全局变量。您可以挂起一个脚本,将您的文件与包装代码一起写入一个命名管道,该管道看起来像一个包含文件,您可以将其#include。但除此之外,编译器不会读取其他文件,只会读取每个 c/c++ 源文件及其#include。

标签: c++ c++11


【解决方案1】:

Google 充满了 C 风格的答案。

这些答案也适用于 C++。 C++ 没有使这变得更容易的功能......但是 1.

可用选项概述:

  • 将内容复制到已编译的目标文件中。这不能跨语言实现移植。可以使用objcopy 等工具来实现。
  • 将文件包含在链接描述文件中。这不能跨语言实现移植。
  • 生成一个源文件(基于输入文件),它初始化一个包含内容的字节数组。 xxd 工具(来自vim 编辑器)可用于执行此操作。这是可移植的,尽管对于像这样包含多大文件可能存在特定于实现的限制。

重新考虑在编译时导入文本文件对于您的用例是否是一个好主意也是值得的。通常,在运行时读取文件更有用,因为它允许轻松更改文件而无需重新编译。

1 有一个proposal 可以将此类功能添加到未来的标准中。

【讨论】:

  • 你有使用这个库github.com/ThePhD/embed的经验吗?
  • 好的,我发现可以使用具有 std::embed 功能的修补编译器,但这似乎不适合我的用例。好吧,我想我必须使用 C 风格。
  • 引用 Stackoverflow 上的另一个答案“如果您有兴趣探索该功能,godbolt.org 有 gcc 和 clang trunk 版本以及 std::embed 补丁可供在线使用。”
  • 大声笑:constexpr std::span<const std::byte> data = phd::embed("/dev/urandom", 1); static_assert((data[0] % 2) == '\0', "You lose."); :-)
  • @TedLyngmo 另一个想法:std::embed("/proc/self/cmdline")自动记录编译命令
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-01
  • 1970-01-01
  • 2019-12-11
  • 2014-08-01
  • 2018-08-22
  • 2017-11-06
相关资源
最近更新 更多