#define DECLARE_DELETE_PTR(type) \
void DeletePtr_##type(string &operand) \
{\
}\
什麼的##
在C++中的宏定義的含義是什麼意思?什麼##在C++中的定義代碼
跟隨代碼有什麼區別?
#define MAKE_STRINGS(VAR) #VAR
它只有一個#,但前者是二#
#define DECLARE_DELETE_PTR(type) \
void DeletePtr_##type(string &operand) \
{\
}\
什麼的##
在C++中的宏定義的含義是什麼意思?什麼##在C++中的定義代碼
跟隨代碼有什麼區別?
#define MAKE_STRINGS(VAR) #VAR
它只有一個#,但前者是二#
它加到你通過參數type
值...
DECLARE_DELETE_PTR(gremlin)
將擴展爲:
void DeletePtr_gremlin(string &operand)
{
}
它要求預編譯器來連接兩個標記。
#define DECLARE_DELETE_PTR(type) \
void DeletePtr_##type(string &operand) \
{\
}\
DECLARE_DELETE_PTR(int)
會給:
void DeletePtr_int(string &operand)
//^^^ the macro argument is int, so the precompiler replaces it here
{
}
事實上,在宏代碼,參數type
與命令的其餘部分連接起來。如果宏參數是int
,那麼這只是一個簡單的替代,給出了上述結果。請記住,由於它是預處理器指令,它完全在編譯時發生。
如果你在linux上,我建議看看cpp
命令,以便更好地理解和嘗試。
至於你的第二個問題,區別在於它只是兩個不同的操作符。正如顧名思義 - >它將它的參數變成一個c字符串(我剛剛嘗試過)。例如:
std::cout << MAKE_STRINGS(Hello World) << std::endl;
會變成:
std::cout << "Hello World" << std::endl
或者,更有趣:
std::cout << MAKE_STRINGS("Hello" World) << std::endl;
變爲:
std::cout << "\"Hello\" World" << std::endl;
看來它也需要逃避的護理特殊字符,但是我可能是錯的 - 這來自3分鐘前的實驗。
見(除其他)[以C近拍指令(http://stackoverflow.com/questions/8685619/macro-directives -in-c-my-code-example-doesnt-work)用於討論字符串化(使用單個'#',如各種答案的註釋中所述)和[C預處理器和級聯](http:// stackoverflow 。com/questions/1489932/c-preprocessor-and-concatenation /)來獲取這個問題的重複。 – 2013-05-13 06:59:16