C语言如何在编译期导入二进制数据
本文最后更新于:2025年1月8日
在做某个 OS 实验的时候遇到了这个需求,实验指南建议使用 xxd 将二进制文件转换成 C/C++ 可以接受的常量数组
1 |
|
但是这样会导致代码文件体积膨胀。
更优雅的办法是通过incbin
直接将二进制数据放进ELF文件的只读区,NEMU和iPXE都使用了类似的方法。
1 |
|
甚至可以用这个方法实现 quine
1 |
|
需要注意的是这个方法在有些平台/编译器并不适用,比如MSVC x64 版不支持内联汇编。
这篇文章给出了更多的方式,比如 objcopy, Windows rc file
github上的incbin库考虑了多个平台多个编译器。
C23中引入了#embed宏,可以在编译时将指定内容设置为字符数组:
1 |
|
c++也有std::embed
和#depend
相关的提案。