2015年11月6日 星期五

MARCO in C++ 愈用愈好用的地方

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
#else
#include
#endif
#include
class AutoTimer
{
//...
#ifdef _WIN32
DWORD mStartTime;
#else
struct timeval mStartTime;
#endif
};

語法解釋

  1. #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. 參數變成字串,參數前要加上#
  2. 參數變成字元,參數前要加上#@
  3. 參數要和唯讀字串組合成新字串,參數前要加上#,並和唯讀字串隔一個空白。

參考資料:

[1] [C++ 文章收集] C++中 #define的用法 - 程式扎記

沒有留言:

張貼留言