MARCO in C++ 愈用愈好用的地方
¶MARCO in C++ 愈用愈好用的地方
原文連結: https://darkblack01.blogspot.com/2015/11/marco-in-c.html
移植時的最後更新日期: 2015-12-23T14:16:57.690+08:00
MARCO,是c語言的特性。
c為了c也將它收進來。
c的使用者,不一定是c高手,MARCO也就不一定用得好。
c的使用者,不一定是c高手,同上!XD
所以,MARCO用得讓人覺得程式怎麼愈寫愈…不開心。
是時有所聞~
MARCO包起來的,我認為是c語言時代的「程式碼片段」(比起翻譯成什麼「宏」來得好一點^^)
那麼要如何時用呢?
預防再次宣告(.h檔常用)
先看例子#ifndef MY_CLASS_H
#define MY_CLASS_H
class MyClass
{
//…
};
#endif
語法解釋
- #ifndef MY_CLASS_H 如果,還沒有定義過MyClass這個字
- #define MY_CLASS_H 定義MY_CLASS_H這個字
- #endif 結束MACRO的if
條件編譯
程式碼參考自C++ API Design Ch3 p.68
// autotimer.h
#ifdef _WIN32
#include <windows .h="">
#else
#include
#endif
#include
class AutoTimer
{
//…
#ifdef _WIN32
DWORD mStartTime;
#else
struct timeval mStartTime;
#endif
};
語法解釋
- #ifdef _WIN32 如果定義了_WIN32
IDE會幫你在編譯時選定的一個參數。
也許是_DEBUG,指的是要進入debug模式。
取代參數化的容器初始化
在此,希望程式內部使用enum取代string。外部傳入string,在程式內部會置換成enum
enum AType
{
A1 = 0, A2, A3, ATotal
}
map<std::string,
AType> ATypeMap;
如果不使用MARCO,會麼寫。(也許有更好的寫法啦) ATypeMap[“A1test”] = A1;
ATypeMap[“A2test”] = A2;
ATypeMap[“A3test”] = A3;
如果使用MARCO,程式碼就可以這樣寫。 #define ADD_MAP(x) ATypeMap[#x test] = x
ADD_MAP(A1);
ADD_MAP(A2);
ADD_MAP(A3);
語法解釋
MARCO的參數[1]- 參數變成字串,參數前要加上#
- 參數變成字元,參數前要加上#@
- 參數要和唯讀字串組合成新字串,參數前要加上#,並和唯讀字串隔一個空白。
參考資料:
[1] [C++ 文章收集] C++中 #define的用法 - 程式扎記
發表於
tags:
{ C_and_Cpp }