2012-07-02 55 views

回答

0

由於宏不能生成任何C++預處理器指令,因此無法通過定義宏來生成#define以保護是否可以重新生成。你必須有獨立的預處理器的控制來處理它,不知何故:

#define CLASS_GENERATOR_MACRO(x, y, z) ...defines class x with attributes y, z... 

#ifndef GENERATED_CLASS_A 
#define GENERATED_CLASS_A 
CLASS_GENERATOR_MACRO(a, int, vector<std::string>); 
#endif /* GENERATED_CLASS_A */ 

然而,沒有什麼是自動強制唯一一個使用CLASS_GENERATOR_MACRO創建a類。也就是說,該文件還可以包含:

CLASS_GENERATOR_MACRO(a, double, double); 

,編譯器會抱怨之類的重定義(如果同時出現在同一個範圍內)。

宏可以生成調用_Pragma。你的系統有一個外部的機會提供了一個可以提供幫助的附註。但最有可能的不是使用編譯指示的便攜式解決方案。

-1

該解決方案假定所需的行爲是在每次使用宏的情況下實例化一個新類,但名稱不同。

可以結合使用__LINE__ macropre-processor token pasting operator ##在宏實例化過程中生成唯一的令牌。

#define LOCAL_CLASS(_Base) class _Base ## __LINE__ { /* class definition */ } 

這可以被用作這樣:

LOCAL_CLASS(SomeBase); 
LOCAL_CLASS(SomeBase); 

這將產生下面的代碼(假設宏上線2和源文件的3實例:

class SomeBase2 { /* class definition */ }; 
class SomeBase3 { /* class definition */ }; 

這個解決方案的缺點是,生成的類的名稱會根據聲明文件中的哪個位置而發生變化,因此不能被依賴。如果說類是n,這不是問題不意味着被宏的用戶消費;該類正在保存由宏與外部庫自動註冊的信息。