[英]C Macro to protect definitions
有沒有辦法保護宏定義? 具體而言,請考慮以下內容:
#define macro1 x
// code segment 1 involving macro1 goes here
// code segment 2 involving macro1 goes here
// code segment 3 involving macro1 goes here
在示例中,我放置了3條注釋,表示涉及宏的代碼段。 我現在想做的是避免使宏影響代碼段2。是否有辦法告訴編譯器替換段1和段3中的所有macro1實例,而不是替換段2中的所有實例? 這是一種可能的方法:
#define macro1 x
// code segment 1 involving macro1 goes here
#undef macro1
// code segment 2 involving macro1 goes here
#define macro1 x
// code segment 3 involving macro1 goes here
缺點是我必須再次定義宏。 假設我想在程序中使用NULL字(不要問我為什么只選擇它)。 我希望這是一個變量,但在大多數情況下C預處理器會將其更改為0。 所以我想做的是能夠在短時間內將其阻止,然后使其恢復原狀。
嘗試失敗:
讓我們假設macro1已在外部某個位置定義,我們甚至不知道該宏的值是什么。 我們要做的就是避免用它代替第二部分中的內容。
// code segment 1 involving macro1 goes here
#ifdef macro1
#define TEMP macro1
#undef macro1
#endif
// code segment 2 involving macro1 goes here
#ifdef TEMP
#define macro1 TEMP
#undef TEMP
#endif
// code segment 3 involving macro1 goes here
這個想法是檢查宏是否存在,如果存在,那么我們要將值存儲到另一個變量中,取消定義宏,最后在需要時再次定義宏。 不幸的是,該代碼無法正常工作,因為在執行代碼段3之前,宏1將被TEMP取代,而不是TEMP應該具有的值。
GCC和MSVC允許您使用編譯指示來推送和彈出宏定義:
#define X 1
#pragma push_macro("X")
#undef X
#define X -1
#pragma pop_macro("X")
int x [X];
使代碼塊不受宏影響的最簡單方法是將宏放在標頭.h
文件中,並且不要在正在編譯的源文件中包含標頭文件。
這意味着您可能必須“切碎”一個更大的文件,以獲取不受宏影響的代碼段。 是的,這很痛苦,但聽起來它無論如何都不應該與其余代碼一起使用(否則就不成問題了)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.