【发布时间】:2014-11-27 11:27:40
【问题描述】:
我想知道在 C++11/14 中是否可以在编译时实际读取文件。例如下面的代码只有在可以成功读取文件的情况下才会编译。
constexpr std::string shader_source = load("~/foo.glsl");
你认为这可能吗?
我知道在构建我的应用程序时,我可以使用一些自定义工具来做到这一点。
【问题讨论】:
-
这取决于你通过 load 断奶的内容。我知道的唯一解决方案是
#include,这意味着编译器必须能够理解文件的内容。 -
您可能想要的是一个外部变量声明,它将由链接器与实际数据相匹配。将它与将任意二进制资源嵌入到目标文件中的工具相结合,并使用您选择的导出符号,您就可以了。 (我可以建议这样一个工具,但你没有提到你正在使用什么工具链,并且 ELF、CV、PE、a.out 对象文件格式的工具是不同的)请注意,将资源转换为 C/C++ 代码为用十六进制字面量初始化的常量数组可能会非常非常慢,所以直接进入目标文件。
-
我不敢相信您的
load函数是constexpr。所以完整的表达式不能是 constexpr。我不知道外部文件内容如何成为 constexpr 字符串。唯一的方法是使用一个简单的加载文件并生成c/c++代码的工具。 -
鉴于 C++ 没有提供执行此操作的方法,假设特定的编译器/链接器,您会得到答案 - 您可能希望指定实际的操作系统/可移植性需求。
-
是的,c++源文件可以读取