2012-02-14 95 views
11

我目前正在寫在MFC C++已經開發的項目和具有定義現在面臨一個問題,已經存在的宏:重新定義或改變宏觀價值

#define HEIGHT_TESTS 13 

我試圖改變從價值在代碼中,但我認爲自從它是一個預處理的定義之後,我無法做到這一點。有沒有辦法可以解決這個問題,而不必更改原始宏(因爲它可能會影響程序的原始功能)。我只是打算在一個特定的情況下改變它,在其他地方休息它仍然是一樣的。

爲了讓每個人都知道,我顯然嘗試過使用不同的宏定義和我打算使用的值(17),但是沒有這樣的運氣。

任何幫助將不勝感激。

+0

我會建議有另一個宏爲您的目的,而不是#undefining和重新定義它。 – Ajay 2012-02-14 09:39:56

+0

請注意,如果需要恢復,您將無法保存現有值並將其恢復。唯一的辦法是用13重新定義宏,這顯然是一個硬編碼值。至於答案,你已經有2個以下是正確的。 – 2012-02-14 09:40:33

+0

我確實嘗試過使用不同的宏,但沒有成功。該程序崩潰。它只有當我改變這個特定的#define值,它給了我一個正確的結果(不是我打算得到這個特定的條件的結果)。 – Neophile 2012-02-14 09:43:18

回答

25

您可以undef INE並define再次:

#include <iostream> 

#define AAA 13 

int main() 
{ 
    #undef AAA 
    #define AAA 7 
    std::cout << AAA; 
} 

輸出:7

請注意,與#開始陳述預處理指令在代碼編譯之前就已經被處理了。在這種情況下,這個常數AAA將被簡單地替換爲7,即它的工作原理就像文本替換,沒有額外的語法檢查,沒有類型安全等...

...這是您應該這樣做的主要原因避免使用宏和#define S其中,他們可以通過靜態函數和變量:)


爲什麼「文本替換」被取代?

看看這段代碼:

#include <iostream> 

#define AAA 13 

void purePrint() { 
    std::cout << AAA; 
} 

void redefAndPrint() { 
    #undef AAA 
    #define AAA 7 
    std::cout << AAA; 
} 

int main() 
{ 
    #undef AAA 
    #define AAA 4 
    purePrint(); 
    redefAndPrint(); 
    purePrint(); 
} 

預處理進線從頂部的底線,這樣做:

  • 啊,#define AAA 13,所以當我打AAA未來時間,我會放在那裏13
  • 看,purePrint使用AAA,我是r與13
  • 等待eplacing它,現在他們告訴我用7,所以我會停止使用13
  • 所以在這裏redefAndPrint()我就放在那裏7

改造給出代碼到這一個中:

#include <iostream> 

void purePrint() { 
    std::cout << 13; 
} 

void redefAndPrint() { 
    std::cout << 7; 
} 

int main() 
{ 
    purePrint(); 
    redefAndPrint(); 
    purePrint(); 
} 

這將輸出13713和最新的#define AAA 4將不會被使用。

+0

那麼,我們可以在程序的任何地方再次使用'#undef'和'#define'? – Neophile 2012-02-14 09:49:58

+1

@ Nerds.Dont.Swear:是的。而當你調用'#undef AAA'時,你甚至不用擔心之前是否定義了AAA。 – LihO 2012-02-14 09:51:35

+0

你的意思是定義* :) – Neophile 2012-02-14 09:53:44

4

類似以下內容:

#undef HEIGHT_TESTS 
#define HEIGHT_TESTS 17 

// Use redefined macro 

// Restore 
#undef HEIGHT_TESTS 
#define HEIGHT_TESTS 13