我需要構建一個自動化系統來解析C++ .h文件,其中包含大量的#define
語句,並使用每個#define
可用的值進行操作。除了#define
聲明之外,.h文件還有很多其他垃圾。評估C++頭文件中的所有宏
目標是創建一個鍵值列表,其中鍵是所有由#define
語句定義的關鍵字,值是對應於這些定義的宏的評估。 #defines
使用一系列嵌套宏定義關鍵字,這些宏最終解析爲編譯時的整型常量。有一些不能解決編譯時整數常量,並且這些必須被跳過。
.h文件將隨着時間的推移發展,所以該工具不能是一個長的硬編碼程序,它實例化一個變量以等於每個關鍵字。我無法控制.h文件的內容。唯一的保證是它可以用一個標準的C++編譯器構建,並且更多的#defines
將被添加,但從不刪除。宏公式可能隨時改變。
我看到這種情況的選項是:
- 實現的局部(或鉤到現有的)C++編譯器和在預處理步驟截取的宏的值。
- 使用regexes動態構建一個源文件,該文件將消耗當前定義的所有宏,然後編譯並執行源文件以獲取所有宏的評估形式。以某種方式(?)跳過不計算爲編譯時整數常量的宏。 (另外,不知道正則表達式是足夠的表現力捕捉到所有可能的多行宏定義)
這兩種方法都將增加相當大的複雜性和脆弱性的生成過程爲這個項目,我想避免的。有沒有更好的方法來評估C++ .h文件中的所有#define
宏?
下面是我所期待解析一個例子:
#ifndef Constants_h
#define Constants_h
namespace Foo
{
#define MAKE_CONSTANT(A, B) (A | (B << 4))
#define MAGIC_NUMBER_BASE 40
#define MAGIC_NUMBER MAGIC_NUMBER_BASE + 0x2
#define MORE_MAGIC_1 345
#define MORE_MAGIC_2 65
// Other stuff...
#define CONSTANT_1 MAKE_CONSTANT (MAGIC_NUMBER + 564, MORE_MAGIC_1 | MORE_MAGIC_2)
#define CONSTANT_2 MAKE_CONSTANT (MAGIC_NUMBER - 84, MORE_MAGIC_1 & MORE_MAGIC_2^0xA)
// etc...
#define SKIP_CONSTANT "What?"
// More CONSTANT_N mixed with more other stuff and constants which do
// not resolve to compile-time integers and must be skipped
}
#endif Constants_h
我需要擺脫的,這是所有編譯時其決心的定義整型常量的名字和評估。在這種情況下,顯示的定義它是
MAGIC_NUMBER_BASE 40
MAGIC_NUMBER 42
MORE_MAGIC_1 345
MORE_MAGIC_2 65
CONSTANT_1 1887
CONSTANT_2 -42
這其實並不重要,這個輸出是什麼格式,只要我可以用它作爲鍵值對的列表,進一步紮實工作,管道。
只需使用現有的C預處理程序來幫助你。帶'-dU'選項的常規GNU'cpp'應該會讓你非常接近你之後的結果。 –
爲什麼輸出中的「CONSTANT_1」和「CONSTANT_2」,但是「MAGIC_NUMBER_BASE」,「MAGIC_NUMBER」,「MORE_MAGIC_1」,「MORE_MAGIC_2」不是?它看起來符合你的標準(定義了編譯時整數常量的解決方案),至少和其他兩個一樣。 –
@BenVoigt他們應該在輸出中,我現在要修復它。 – Techrocket9