預處理器符號是的名稱。沒有預處理指令可以在保留內容的同時更改名稱本身。例如,給定任一:
#define FOO 42
或
#define FOO(x, y) x ## y (
沒有方法來定義一個宏稱爲BAR
其具有相同的內容,而無需重複這些定義。也就是說,不存在像無操作:
#alias BAR FOO // nonexistent fantasy macro-cloning preprocessor directive
也不是這樣的:
#rename BAR FOO // like #alias BAR FOO followed by #undef FOO
如果我們這樣做:
#define BAR FOO // for the #define FOO 42 case
它不是一個別名。宏BAR
被定義爲使得其替換標記序列是標記FOO
而不是42
。如果FOO
宏消失,則BAR
失去其含義。
還要注意的是C預處理宏不能擴展到預處理指令,所以下面的方法也行不通:
// wrong:
#define MACRO_DEFINER(NAME) \
#define NAME 42
MACRO_DEFINER(FOO) // hoping for #define FOO 42: no such luck
MACRO_DEFINER(BAR) // hoping for #define BAR 42: likewise
恐怕你得走幾步回頭找一個您想要解決的任何問題的替代策略。如果您遇到問題,請創建一個關於實際問題的新問題。
始終存在代碼生成:在構建時生成C或C++。那麼,如果你只是調整你的發電系統,那麼你可以想象的任何文本替代或擴展都是可能的。
來源
2016-01-13 02:07:59
Kaz
如果你想從第三方頭文件中獲得LIB_XYZ的定義,並且不想使用除C編譯器以外的任何東西,我認爲你被卡住了。如果我必須這樣做,我可能會編寫一個腳本來將lib.h轉換爲our_lib.h,並選擇#define進行修改,使我的代碼包含our_lib.h,並使用makefile來使正確的事情發生,如果lib .h改變了。 –
也許[這](http://stackoverflow.com/questions/1793800/can-i-redefine-a-c-macro-then-define-it-back)可以幫助。 –