TMS*_*TMS 2 metaprogramming c++11
我知道这个网站上有很多类似的问题。我真的很喜欢以下链接中提到的解决方案:
\n\n\n\n经过一些修改,您可以在编译时包含文本文件,例如:
\n\nconstexpr const char* s = \n#include "file.txt"\nRun Code Online (Sandbox Code Playgroud)\n\n但是要使其工作,您必须向原始文件添加字符串文字前缀和后缀,例如
\n\nR"(\nThis is the original content,\nand I don\'t want this file to be modified. but i\n don\'t know how to do it.\n)";\nRun Code Online (Sandbox Code Playgroud)\n\n我的问题是:有没有一种方法可以使其工作但不修改 file.txt?
\n\n(我知道我可以使用命令行工具来制作副本,在副本前面添加和附加到副本,在编译后删除副本。我正在寻找比这更优雅的解决方案。希望不需要其他工具)
\n\n这是我尝试过的(但不起作用):
\n\n#include <iostream>\n\nint main() {\n constexpr const char* s =\n#include "bra.txt" // R"(\n#include "file.txt" //original file without R"( and )";\n#include "ket.txt" // )";\n std::cout << s << "\\n";\n return 0;\n}\n\n/opt/gcc8/bin/g++ -std=c++1z a.cpp\nIn file included from a.cpp:5:\nbra.txt:1:1: error: unterminated raw string\n R"(\n ^\na.cpp: In function \xe2\x80\x98int main()\xe2\x80\x99:\na.cpp:4:27: error: expected primary-expression at end of input\n constexpr const char* s =\n ^\na.cpp:4:27: error: expected \xe2\x80\x98}\xe2\x80\x99 at end of input\na.cpp:3:12: note: to match this \xe2\x80\x98{\xe2\x80\x99\n int main() {\n ^\nRun Code Online (Sandbox Code Playgroud)\n
不,这是不可能的。
\n有一个c++2a提案允许在编译时包含此类资源,称为std::embed。
\np1040r1 提案的动机部分:
\n\n\n每个 C 和 C++ 程序员——在某些时候——都会尝试将
\n#include大量非 C++ 数据放入他们的代码中。当然,#include期望数据的格式是源代码,因此程序失败并出现严重的词法分析器错误。因此,许多不同的工具和实践都被用来处理这个问题,早在 1995 年就出现了 xxd 工具。许多行业都需要此类功能,包括(但不限于):\n
\n- \n
金融发展
\n\n
\n- 表示性能关键算法的系数和数值常量;
\n- \n
游戏开发
\n\n
\n- \n
在运行时不会改变的资源,例如图标、固定纹理和其他数据
\n- \n
着色器和脚本代码;
\n- \n
嵌入式开发
\n\n
\n- \n
以压缩良好的格式存储大块二进制文件,例如固件
\n- \n
将数据放置在没有操作系统或文件系统的芯片和系统的内存中;
\n- \n
应用开发
\n\n
\n- \n
表示数据的压缩二进制 blob
\n- \n
在运行时不改变的非C++脚本代码;和
\n- \n
服务器开发
\n\n
\n- 配置参数在构建时已知,并被烘焙以设置限制并提供编译时信息以调整某些负载下的性能
\nSSL/TLS 证书硬编码到可执行文件中(在部署新证书之前需要重建和潜在授权)。
\n在追求这一目标的过程中,这些工具已被证明存在不足,并且随着 C++ 开发周期不断扩展到更大、更好的低端设备和高性能机器,它们对 C++ 开发周期的贡献很小,使开发人员陷入琐碎的构建任务和试图掩盖平台之间令人失望的差异。
\nMongoDB 非常友善地分享了下面的一些代码。其他公司已经将他们的示例代码匿名化,或者干脆不直接将其包含在内,因为他们为支持其工作流程而需要做的事情感到羞耻。作者感谢 MongoDB 的勇气和支持
\nstd::embed.对某种形式的请求
\n#include_string追溯到很久以前,最古老的堆栈溢出问题之一的询问和回答可以追溯到近 10 年前。甚至在此之前就有大量的邮件列表帖子和论坛帖子询问如何获取脚本代码和其他不太可能更改为二进制文件的内容。本文提出
\n<embed>使这一过程更加高效、可移植和简化。这里\xe2\x80\x99是一个理想的例子:Run Code Online (Sandbox Code Playgroud)\n#include <embed>\n\nint main (int, char*[]) {\n constexpr std::span<const std::byte> fxaa_binary = std::embed( "fxaa.spirv" );\n \n // assert this is a SPIRV file, compile-time \n static_assert( fxaa_binary[0] == 0x03 && fxaa_binary[1] == 0x02\n && fxaa_binary[2] == 0x23 && fxaa_binary[3] == 0x07\n , "given wrong SPIRV data, check rebuild or check the binaries!" )\n\n auto context = make_vulkan_context();\n\n // data kept around and made available for binary\n // to use at runtime\n auto fxaa_shader = make_shader( context, fxaa_binary );\n\n for (;;) {\n // ...\n // and we\xe2\x80\x99re off!\n // ...\n }\n\n return 0;\n}\n
| 归档时间: |
|
| 查看次数: |
2154 次 |
| 最近记录: |