2016-01-20 57 views
0

我使用捕捉庫單元測試Catch Lib問題 - 匿名命名空間重新定義。如何解決

以前,我單獨測試一個頭,並與TEST_CASEs但最終經過包括所有的這些到我面臨着很多誤區,如項目沒有問題這個:

c:\dev\workspace\algolist\src\algolist.hpp(143): error C2374: '`anonymous-namespace'::autoRegistrar143': redefinition; multiple initialization 
c:\dev\workspace\algolist\src\mfactory.hpp(143): note: see declaration of '`anonymous-namespace'::autoRegistrar143' 
c:\dev\workspace\algolist\src\algolist.hpp(143): error C2084: function 'void ____C_A_T_C_H____T_E_S_T____143(void)' already has a body 
c:\dev\workspace\algolist\src\mfactory.hpp(143): note: see previous definition of '____C_A_T_C_H____T_E_S_T____143' 

有人能解釋一下這是什麼意思?

+0

不知道的框架,但似乎是宏只是基於沒有文件名的代碼行可能正在創建函數和命名空間的名稱,因爲這兩個文件都在143線東西有一個名稱衝突現在 –

回答

1

它看起來像你把TEST_CASE放在HPP文件中,然後在同一個CPP文件中包含它們。您有幾種選擇:

  • 改爲將測試用例移動到CPP文件。這是首選解決方案。
  • 將某個測試用例上移或下移一行,以便自動生成的名稱不同,因此不會發生衝突。這是一個短期回來。
  • 如果您真的想通過包含這些測試來共享這些測試,請將測試主體留在頭文件中,但刪除TEST_CASE宏,而是從CPP文件中的測試用例中調用它們。
+0

是的,我有幾個hpp文件作爲一個獨立的libs,內置於一個二進制文件中,除了代碼本身,每個hpp都包含TEST_CASEs,這是一個只有頭文件的庫,main.cpp只是一個CATCH_CONFIG_MAIN。 – amigo421

+0

通常,測試進入CPP文件。對於只有標題的庫沒有問題,但是是否希望庫的客戶端也包含測試? – JBRWilkinson

+0

它由#define定義,但是,您是對的,已經移至分隔文件。你是否有經驗?我正在尋找cmake腳本來自動將項目的catch測試提取到ctest中 – amigo421