2016-05-27 44 views
2

我有一些C文本文本文件。我希望在編譯時(理想情況下使用cmake)獲取此文件中的文本,並使用它生成一個簡單的C++頭文件 - 一個包含幾個include,名稱空間聲明和一個std :: string的文件值是我的文本文件的內容,新行和所有內容。在編譯時將文本文件轉換爲字符串

這樣做的最好方法是什麼?

+0

一個簡單的shell腳本應該能夠做到這一點。讀取文件,然後將其寫入'std :: string varname =「...」;'的初始化中。要記住的主要事情是避免任何雙引號和反斜槓。 – Barmar

+0

@Barmar:可能更容易使用原始字符串(至少在大多數情況下)。 –

+0

我很確定這是重複的。最簡單的方法是在原始字符串文字定義中使用一些嵌套的'#include'語句。 –

回答

0

好的,所以我採用了不同於此處建議的解決方案。這就是我所做的。

在我的源代碼中,我定義了一個處理程序類,我將使用我需要的字符串字面值。這裏有兩件事很重要:

  • 在版本控制下,頭文件實際上是一個.hpp.in。實現文件是正常.cpp
  • 這裏面的頭文件,我選擇一個變量,#定義它如此:#define MY_STRING @[email protected]

現在,的CMakeLists.txt負責這兩個文件裏面,我這樣做:

  • 閱讀的原始文本文件轉換成一個cmake的變量
  • 刪除所有//意見,結果保存在臨時變量
  • 全部替換\n字符與字符串"newline",將結果保存到一個新的臨時變量
  • 定義我在上面我的標題中使用的相同變量(即, MY_STRING),並從該最新臨時變量
  • 複製從它的位置標頭通過指定@ONLY下$ {CMAKE_SOURCE_DIR}它分配到適當的位置下$ {CMAKE_BINARY_DIR}(和它重命名爲一個.hpp)。這可以確保cmake將複製頭文件,但也會更新#define MY_STRING @[email protected],其值爲MY_STRING我稍早設置。

最後,我的處理程序的執行文件中我定義下面的宏:

#define STRINGIFY(x) #x 
#define TOSTRING(x) STRINGIFY(x) 

,這樣我可以打電話TOSTRING(MY_STRING)和輸出分配給std::string my_string。一旦完成,我需要做的就是用"\n"替換"newline"佔位符字符串 - 我就完成了! my_string現在具有與原始文本文件中的值相同的值(不含註釋)。

我希望我有更多的時間來玩這個遊戲,而其他的任務讓我分散注意力,但事情的方式,現在要做。

謝謝大家的幫助!

相關問題