2017-09-15 101 views
-1

我需要做的是「微調」一些應與程序其餘部分一起編譯的常量值,但我想在每次更改時驗證結果,而不必修改一個值並且每次重新編譯整個程序。所以我在考慮在每次更改數字時重新加載一種純文本配置文件,並重新初始化部分程序以對新值執行操作。這是我經常做的事情,但是這一次我想要做的是有一個具有以下語法有效納入文件的形式下,此配置文件:C++在運行時評估包含文件

const MyStructure[] = 
{ 
    { 1, 0.5f, 0.2f, 0.77f, [other values...] }, 
    { 3, 0.4f, 0.1f, 0.15f, [other values...] }, 
    [other rows...] 
}; 

如果我使用的解釋性語言,如Perl,我會使用eval()函數,如果C++不可行的話。儘管我已經閱讀了關於在C++中使用eval()函數的其他問題,但我想要的不是評估和運行此代碼,而是解析它並將這些值放入它們所屬的變量中。

我可能會使用正則表達式來解析上面的C語法,但是再一次,RegExp仍然不是值得在C++中使用的東西,那麼您能否提出一種替代方法?

這可能是值得說的,我只需要在開發階段解析這個文件。當程序準備好發佈時,我會#include

+0

只需將常規文件中的數據加載到非'contst'變量中即可。你不會從「這個變量是const」,但有時它會改變「。 – nwp

+0

爲什麼不只是有一個數據文件? – KonstantinL

+0

我知道英語不是我的母親toungue,但我不認爲我的帖子不夠清楚,當我說我只需要在開發階段更改此文件。一旦程序完成,這些數據必須保持不變,不再改變。擁有一個不再需要改變的數據文件是毫​​無意義的。我的主要目標是加速開發過程,避免每次需要更改數據結構中的某些內容時重新編譯整個程序。 –

回答

0

編寫您自己的解析器可能比適合此用例的工作更多。

一個更簡單的解決方案是將包含變量的文件分別編譯爲共享對象或DLL,它可以在運行時動態加載。 (精確的細節取決於您的操作系統。)如果需要,您也可以在程序初始化期間調用編譯器。

如果您不想處理查找符號並將其複製到靜態變量的複雜性,也可以將程序的大部分作爲共享對象進行編譯,只有一個小的墊片作爲主可執行文件。該墊片將:

  • 如有必要,調用編譯器來創建數據共享對象

  • 動態加載數據共享對象

  • 動態加載該程序共享對象,並

  • 使用它的main入口點調用主程序(可能使用不同的名稱)。

要生產生產版本,只需要將程序和數據一起編譯,並直接使用它,而不使用墊片。

這個主題的變化是可能的,取決於具體的需求。