簡體   English   中英

C宏來保護定義

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM