C 怎麼把任意文字檔案include成全域性字元陣列?

時間 2021-05-06 04:44:47

1樓:秦雨貓

在Makefile裡調xxd -i,把待引入的檔案轉換成C標頭檔案,再在原始檔裡引入。

如果嫌這樣佔空間的話,可以調xxd -i [infile] - | cc -x c -c -o [outfile] -,再在原始檔裡宣告對應的字串和長度變數,鏈結上述物件檔案[outfile]。

2樓:Max Xing

如果不限定非要使用 「#include」,並且你不介意用一點巨集來解決問題的話,你可以定義乙個這樣的巨集:

#define EMBED_STR(name, path

extern const char name

asm(".section .rodata, \"a\", @progbits\n" \

#name ":\n"

".incbin \"" path "\"\n"

".byte 0\n"

".previous\n");

這個巨集實際上借助了:

彙編器的 「.incbin」 directive,直接把任意乙個二進位制檔案 include 到當前的目標檔案裡;

C/C++ 的內聯彙編功能。

#include

#define EMBED_STR(name, path

extern const char name

asm(".section .rodata, \"a\", @progbits\n" \

#name ":\n"

".incbin \"" path "\"\n"

".byte 0\n"

".previous\n");

EMBED_STR

(kCurSourceFile

,"example.cpp"

);int

main

()輸出見:Compiler Explorer。

這個 trick 曾經在 iPXE 中出現過

[1],當然,原版是直接在 C 語言裡把任意二進位制檔案 include 成了陣列,通用性還要更強一些。

3樓:

xxd 有個 xxd -i 的引數可以把輸入檔案生成C風格的陣列。可以作為編譯的乙個步驟生成檔案。不過不能完全滿足題目的要求。

4樓:傳統的幻想書屋

如果你要讓編譯器自動做的話,那怕是不太行,只是文字的話直接複製進去或者另外寫個cpp程式或者指令碼放進去工作量也不大吧,如果嫌篇幅太大就單獨放個檔案,或者執行的時候再去讀。

再或者用Rust,Rust有這個功能(逃

5樓:暮無井見鈴

可以用 xxd 、指令碼等工具。但是要多乙個階段。

實際上標準委員會的人也為編譯時嵌入二進位制檔案感到困擾。我們知道 C/C++ 預處理器可以包含檔案,也可把記號串變成字串字面量,但這兩個功能不能組合到一起。

於是有人提出了編譯時嵌入的提案,現在分成兩個部分:

P1040R6 「魔法」函式 std::embed ,可以隨處選擇嵌入乙個檔案並得到引用嵌入後二進位制的 span 。現在的發展方向是引入乙個 #depend 預處理指令指定翻譯單元可以嵌入的檔案。

P1967R2, N2592 預處理指令 #embed ,功能比較受限而純粹,即是得到作為嵌入的二進位制資料的陣列初始化器列表。 #embed 是同時針對 C 和 C++ 提出的。

從作者的測試資料可以看出為編譯器增設該功能還是有編譯效能優勢的。

6樓:Muchan

我之前也想過這個問題,結果似乎是不行。預處理器不會動字串字面量裡的內容,就我所知除了字面量之外就只有巨集的#能造出字串了,但巨集展開的參數列又不能有include……

還是學學一些構建工具吧,這個功能用makefile實現就兩三行的事。

怎麼把拍的文字變成掃瞄版

鄧淞文 以前,我把文件內容轉化成文本版都是用手機自帶的提取功能,但是常常提取出來都 相比於手機自帶的提取功能,用掃瞄全能王掃瞄出來的文字排版會更加整潔,而且會按照原有的格式幫你排版好,後期就不需要怎麼去調整,我是更加推薦使用掃瞄全能王的。軟體內還有很多其他功能,像是證件掃瞄 文件編輯 OCR文字識別...

怎麼把C 的併發程式設計玩出花來?

想要花就需要你自己搞一套庫,設計一套與眾不同的風格,不過再花不也不可能比executors更花 timed single thread context context 乙個支援定時器的執行緒 auto scheduler context.get scheduler std atomic count ...

python怎麼把含有關鍵詞的句子,從文字串裡提取出來?

星空 匹配句子 關鍵字匹配 關鍵字 input 請輸入查詢關鍵字 a re.findall 關鍵字匹配.format 關鍵字 匹配句子 for i in a print 第 s句是 s a.index i i 宵夜 mystr 今天的天氣真好,天氣真的好 pattern re.compile 天氣 ...