您可以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
將不會被使用。
我會建議有另一個宏爲您的目的,而不是#undefining和重新定義它。 – Ajay 2012-02-14 09:39:56
請注意,如果需要恢復,您將無法保存現有值並將其恢復。唯一的辦法是用13重新定義宏,這顯然是一個硬編碼值。至於答案,你已經有2個以下是正確的。 – 2012-02-14 09:40:33
我確實嘗試過使用不同的宏,但沒有成功。該程序崩潰。它只有當我改變這個特定的#define值,它給了我一個正確的結果(不是我打算得到這個特定的條件的結果)。 – Neophile 2012-02-14 09:43:18