在C++中是否有一種機制可以用來實現一個宏,以便宏定義一個類,同時多個宏的調用不會導致類重定義錯誤?謝謝!避免重新定義宏定義的類
1
A
回答
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__
macro和pre-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,這不是問題不意味着被宏的用戶消費;該類正在保存由宏與外部庫自動註冊的信息。
相關問題
- 1. 重新定義宏
- 2. 如何編寫宏以避免重新定義?
- 3. 避免重新定義要求()
- 4. 宏重新定義警告
- 5. XCode - 重新定義宏
- 6. C宏重新定義
- 7. Objective-C宏重新定義
- 8. 宏重新定義警告
- 9. 宏重定義
- 10. 球拍Objective-C FFI--避免重新定義類
- 11. 如何避免PANTHEIOS_FE_PROCESS_IDENTITY的多重定義?
- 12. 在定義結構時避免「重定義typedef」警告
- 13. X-宏重定義
- 14. 重新定義記錄的宏
- 15. 忽略或重新定義GCC標準預定義的宏
- 16. C編程:重新定義共享庫中定義的宏(.so)
- 17. QtCreator:避免重新定義在Qt的子目錄LIBS項目
- 18. 我可以避免由特定類定義的限定名嗎?
- 19. 重新定義 「類GtkwidgetDef」 的
- 20. 宏定義宏
- 21. 重新定義進口神社宏
- 22. MIN和MAX重新定義宏?
- 23. 如何在jinja2中重新定義宏
- 24. Xcode警告:'__IPHONE_OS_VERSION_MIN_REQUIRED'宏重新定義
- 25. 重新定義BOOST_FOREACH宏安全
- 26. LaTeX:暫時重新定義引用宏
- 27. 如何在朋友功能模板的類定義的情況下避免重新定義錯誤?
- 28. 避免在eval中重新定義perl格式
- 29. Python包:如何避免重新定義作者版本等?
- 30. 預測單位編輯順序以避免重新定義