2014-05-05 56 views
-3

我想知道,有的人比我多了很多知識可能就會知道答案:如何預處理更在C/C++

爲什麼不是C(在我的情況下,其對C++)預處理器更完整?

我的意思是爲什麼我們不能用C++作爲預處理語言?它將使我們能夠做這麼多關於類,生成動態代碼等等

理想我想調用C++函數就像一個預處理宏,用一個具體的例子,我喜歡做的事情一樣:

#void generateVariable(std::string type, std::string name) { 
# if (name[0] == 'p') 
#  cout << "protected:" << endl << type << " " << name << ";" << endl; 
# if (name[0] == 'm') 
#  cout << "public:" << endl << type << " " << name << ";" << endl; 
# std::string prefix = name; 
# prefix.erase(2, npos); 
# name.erase(0,2); 
# name[0] = toupper(name[0]); 
# cout << "public:" << endl << type << "get" << name << "() const { return " << prefix+name << "; }" << endl; 
#} 

,這樣我可以打電話

class A { 
    generateVariable(static const int, p_age) 
} 

而且,它還將產生

class A { 
    protected: 
     static const int p_age; 
    public: 
     static const int getAge() const { return p_age; } 
} 

實際上有沒有辦法做這種事情,而不是用腳本語言解析整個文件並重寫它?

+0

的_'C++ preprocessor'_由這些意義是模板元編程!你究竟在幹什麼? –

+3

瞭解模板元編程。這與你想要做什麼有關。 – kec

+7

因爲它不會是C++,它會是Lisp。 –

回答

2

預處理實際上可以做到這一點(雖然我不建議這樣做):

#define generateVariable(__type__, __name__) \ 
    protected: __type__ __name__; \ 
    public: __type__ get##__name__() { return __name__; } 

class A { 
    generateVariable(static const int, p_age); 
} 

get##__name__()將擴大到getp_age()雖然...

+0

是的我已經知道這是可能的,但我真的很想解析預處理器中的字符串。在我的例子中,變量名稱是具體的。 – hilnius

+0

@hilnius你仍然可以做相反的事情,得到'Age'作爲參數,並生成'getAge()'和'p_Age'。 –