是否可以在编译时读取文件?

新手上路,请多包涵

我想知道在 C++1114 中是否可以在编译时实际读取文件。例如,下面的代码只有在可以成功读取文件的情况下才会编译。

 constexpr std::string shader_source = load("~/foo.glsl");

你认为这可能吗?

我知道在构建我的应用程序时我可以使用一些自定义工具来做到这一点。

原文由 Maik Klein 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 894
2 个回答

基于 teivaz 的想法,我想知道通常的“扩展后字符串化”技巧是否有效:

 #define STRINGIZE(...) #__VA_ARGS__
#define EXPAND_AND_STRINGIZE(...) STRINGIZE(__VA_ARGS__)

constexpr std::string shader_source = EXPAND_AND_STRINGIZE(
#include "~/.foo.glsl"
);


尽管如此,我还是会选择传统的 extern const char[] 声明由链接器解析为内容。文章 “Embedding a File in an Executable, aka Hello World, Version 5967” 有一个例子:

 # objcopy --input binary \
          --output elf32-i386 \
          --binary-architecture i386 data.txt data.o

当然,您应该更改 --output--binary-architecture 命令以匹配您的平台。目标文件中的文件名以符号名称结尾,因此您可以像这样使用它:

 #include <stdio.h>

/* here "data" comes from the filename data.o */
extern "C" char _binary_data_txt_start;
extern "C" char _binary_data_txt_end;

main()
{
    char*  p = &_binary_data_txt_start;

    while ( p != &_binary_data_txt_end ) putchar(*p++);
}

原文由 Ben Voigt 发布,翻译遵循 CC BY-SA 3.0 许可协议

#define STR(x) #x

const char* a =
{
#include "foo.glsl"
};

并且 foo.glsl 应该将其内容包含在 STR( … )

更新。这将正确处理逗号

#define STRINGIFY(...) #__VA_ARGS__
#define STR(...) STRINGIFY(__VA_ARGS__)

原文由 Teivaz 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题