2011-07-16 26 views
1

我正在寫一個程序,它會從我的程序的最終用戶提供的位域標誌列表中,調用外部庫中的函數。我最初計劃維護所有可能標記的查找表,但標記列表因平臺而異,而且我沒有完整的庫文檔。我曾計劃使用c預處理器在表中包含當前平臺的已定義標誌,但這很難維護,因爲我不得不依賴用戶報告缺少的平臺標誌有訪問權。是否有可能檢查一個標誌是否沒有預定義的查找表而被定義,並只給出標誌名稱作爲字符串?

然後我想我可以允許用戶傳遞標誌名稱作爲字符串。但是我找不到一種方法來測試一個宏是否被定義,只給出該宏的字符串名稱。所以如果用戶想設置標誌FLAG_ABC,他們會傳入「FLAG_ABC」作爲參數,我必須做一些魔術來檢查& FLAG_ABC!= NULL。這可能嗎?

+0

你可以發表一個你想要實現的例子嗎? – cnicutar

+0

不是代碼示例,但請讓我知道我需要澄清哪些內容。 – cspotrun

+0

所以我正確地說,如果你想在運行時檢查是否有#define-d? – Bart

回答

3

所有#define在預處理後都會丟失。如果您希望在運行時提供預處理器符號的信息,則必須將這些宏的名稱(以及當然值)作爲可執行文件中的字符串或作爲單獨的文件存放,然後在運行時將其釋放。我可以想象,如果有兩個標誌列表,一個帶有#define-symbols,另一個帶有字符串,然後手動關心,如果你更新了一個標誌,你也可以更新另一個標誌,而不會出錯。

我會用你在運行時加載的單獨文件去,而不是更新 - 麻煩只是該文件是一個頭文件,你也#include。具體而言,我的建議是:將所有標誌定義#define's轉換爲單獨的頭文件,將其包含在源代碼中,以便您可以像以前一樣使用它,在運行時在文件中創建一個迷你分析器讀取,即將每行#define asdf 0xF1A6解析爲一個字符串和一個int。如果這在實踐中起作用,並且您希望防止用戶意外更改該頭文件,則可以對其進行散列或二進制編碼。

,使用它可以有#define -symbols作爲字符串實際上是在您的二進制文件將產生從該頭文件.rc -file(或兩個頭文件和.rc.csv -file)的替代和然後使用資源編譯器將它嵌入到你的二進制文件的.rsrc部分中,但是你必須編寫幫助程序(它轉換文件),然後把一個調用轉換器程序集成到你的make-script或者build-system中始終有.rc最新。

相關問題