1. 程式人生 > >c++中利用巨集來宣告和定義變數

c++中利用巨集來宣告和定義變數

假設我們要定義一個配置類,類中包含了很多的配置成員,有一種通過巨集的方法可以讓我們方便的維護繁多的成員

在一個類中,定義一個變數需要型別,建構函式中給出的初始值。我們需要能夠像指令碼語言一樣進行配置變數:


tconfig.h

OPTION(m_data,OPT_INT,-1)
OPTION(m_value,OPT_DOUBLE,1)
OPTION(m_change,OPT_FLOAT,1)                                                                                                                                
OPTION(m_isrun,OPT_BOOL,1)

類的定義如下:

class T{
public:
    void func();
public:
    int a;  

/**通過預定義幾種巨集來定義不同型別的變數*/
#define OPTION_OPT_INT(name) const int name;
#define OPTION_OPT_STR(name) const std::string name;
#define OPTION_OPT_DOUBLE(name) const double name;
#define OPTION_OPT_FLOAT(name) float name;
#define OPTION_OPT_BOOL(name) const bool name;

/**通過該巨集使用了上述的幾個不同型別的巨集把配置檔案中的聯絡到一起

巨集中的OPTION_##type通過##使得與type連結在一起,成為上述的巨集的名字

include語句會展開標頭檔案中的內容

由於類的定義一般在都檔案中,為了不使得包含該標頭檔案的檔案產生副作用,undef

*/
#define OPTION(name, type, init) OPTION_##type(name)
#include "config_opt.h"
#undef OPTION_OPT_INT
#undef OPTION_OPT_STR
#undef OPTION_OPT_DOUBLE
#undef OPTION_OPT_FLOAT
#undef OPTION_OPT_BOOL
#undef OPTION

public:
/**建構函式中的使用

需要注意定義的巨集末尾有逗號

根據建構函式列表的需要

構造列表中最後又加了一個變數a

*/    

T() 
    :   
#define OPTION(name, type, def_val) name(def_val),
#include "config_opt.h"
#undef OPTION
    a(100)
    {   
    }   

};