是否有一個C預處理器根據(jù)定義/未定義的值消除#ifdef塊?原始問題我想要的不是標準的C預處理器,而是可以從某個地方接受的變體 - 可能是命令行通過-DNAME1和-UNAME2選項 - 定義了哪些宏的規(guī)范,然后消除了死碼。通過一些例子可能更容易理解我所追求的內容:#ifdef NAME1#define ALBUQUERQUE "ambidextrous"#else#define PHANTASMAGORIA "ghostly"#endif如果命令是使用'-DNAME1'運行的,則輸出將為:#define ALBUQUERQUE "ambidextrous"如果命令是使用'-UNAME1'運行的,則輸出將為:#define PHANTASMAGORIA "ghostly"如果命令是在沒有選項的情況下運行的,則輸出將與輸入相同。這是一個簡單的例子 - 我希望代碼也可以處理更復雜的情況。用現(xiàn)實世界但仍然簡單的例子來說明:#ifdef USE_VOID#ifdef PLATFORM1#define VOID void#else#undef VOIDtypedef void VOID;#endif /* PLATFORM1 */typedef void * VOIDPTR;#elsetypedef mint VOID;typedef char * VOIDPTR;#endif /* USE_VOID */我想運行命令-DUSE_VOID -UPLATFORM1并獲取輸出:#undef VOIDtypedef void VOID;typedef void * VOIDPTR;另一個例子:#ifndef DOUBLEPAD#if (defined NT) || (defined OLDUNIX)#define DOUBLEPAD 8#else#define DOUBLEPAD 0#endif /* NT */#endif /* !DOUBLEPAD */理想情況下,我想運行-UOLDUNIX并獲得輸出:#ifndef DOUBLEPAD#if (defined NT)#define DOUBLEPAD 8#else#define DOUBLEPAD 0#endif /* NT */#endif /* !DOUBLEPAD */這可能是我的運氣!動機:大而古老的代碼庫,包含大量條件代碼。許多條件不再適用 - 例如,OLDUNIX平臺不再生成且不再受支持,因此不需要在代碼中引用它。其他條件總是如此。例如,使用條件編譯添加功能,以便單個版本的代碼可用于功能不可用的舊版本軟件和可用的新版本(或多或少)。最終,不再支持沒有該功能的舊版本 - 所有內容都使用該功能 - 因此應刪除該功能是否存在的條件,并且應刪除“何時缺少功能”代碼。一世'(該工具的一個非常聰明的版本可能會讀取#include'd文件以確定控制宏 - 在命令行上由-D或-U指定的那些宏 - 是否在這些文件中定義。我不確定這是否真的有用,除非作為但是,無論它做什么,偽預處理器都不能擴展宏或逐字包含文件。輸出必須與輸入代碼類似,但通常比輸入代碼更簡單。)狀態(tài)報告(一年后)使用一年后,我對所選答案推薦的' sunifdef ' 感到非常滿意。它還沒有犯錯,我不指望它。我唯一的狡辯是風格。給出如下輸入:#if (defined(A) && defined(B)) || defined(C) || (defined(D) && defined(E))并使用'-UC'運行(C從未定義),輸出為:#if defined(A) && defined(B) || defined(D) && defined(E)這在技術上是正確的,因為'&&'比'||'更緊密,但它是一個混亂的公開邀請。我更傾向于在'&&'條件的集合中包括括號,如原始:#if (defined(A) && defined(B)) || (defined(D) && defined(E))然而,考慮到我必須使用的一些代碼的模糊性,因為這是最大的挑選是強烈的贊美; 它對我來說是很有價值的工具。街區(qū)新人檢查了包含在上面信息中的URL后,我看到(正如預測的那樣)有一個名為Coan的新程序,它是'sunifdef'的繼承者。它可以在SourceForge上獲得,并且自2010年1月以來一直在使用。我將在今年晚些時候,或者明年,或者某個時候,或者從未進行更多報告。
3 回答

HUH函數(shù)
TA貢獻1836條經驗 獲得超4個贊
幾年前我使用unifdef來解決你描述的那種問題,并且它運行良好。即使它自2000年以來還沒有更新,預處理器ifdef的語法從那時起沒有實質性的改變,所以我希望它仍然可以做你想要的。我想可能存在一些編譯問題,盡管這些軟件包最近出現(xiàn)了。
我從未使用過sunifdef,所以我不能直接評論它。
- 3 回答
- 0 關注
- 633 瀏覽
添加回答
舉報
0/150
提交
取消