2011-09-20 28 views
7

我用宏以下列方式產生類:如何用Doxygen記錄宏生成的類?

generator.h:

class CLASS_NAME : public parent 
{ 
    //generate variables with names given by CLASS_VARIABLES using complicated 
    //Boost.Preprocessor stuff. 
}; 

#undef CLASS_NAME 
#undef CLASS_VARIABLES 

myclass.h:

#define CLASS_NAME MyClass 
#define CLASS_VARIABLES (a, b, c, x, y, z) 
#include "generator.h" 

實際的類較爲複雜,且使用不同的加速。預處理器宏。有沒有辦法使用Doxygen自動生成生成的類,方法是向generator.h添加註釋,或者使用文檔生成示例類?我曾嘗試啓用ENABLE_PREPROCESSING和MACRO_EXPANSION,但這似乎不夠。

回答

1

它不會工作。 Doxygen預處理器並沒有真正執行完整的文件包含(它只在包含的文件中查找宏定義;否則,ENABLE_PREPROCESSING指令將完全無用!)。所以#include "generator.h"沒有效果。

如果您在物理上將#include指令替換爲包含文件的內容,它將起作用。 (我知道不太有用)。

另一種方式來做到這一點是可以修改文件是這樣的:

generator.h:

#define DEFCLASS class CLASS_NAME : public parent \ 
{ \ 
    ... whatever ... \ 
}; 

myclass.h:

#define CLASS_NAME MyClass 
#define CLASS_VARIABLES (a, b, c, x, y, z) 
#include "generator.h" 
DEFCLASS 

但這不會,如果你的工作每個源文件使用DEFCLASS不止一次(可能是Doxygen的缺陷/缺陷)。

+0

我想我不能使用你的修改,因爲我在我的類定義中再次使用#include和#define。我可以把'#define'放在類的前面,但我不認爲我可以擺脫'#include's ...... – AbuBakr

+0

正如下面的spyderfreek所述,如果#include包含在{ }塊,包含將起作用。 – Heyji

1

什麼pararaph 「在其他地方文檔」 中http://www.stack.nl/~dimitri/doxygen/docblocks.html

/*! \class CLASS_NAME 
    \brief An auto generated class 

    A more detailed class description. 
*/ 

/*! \fn CLASS_NAME::CLASS_NAME() 
    \brief Default constuctor 
*/ 
+0

嗯,這不知何故無法正常工作。我無法完全按照你的建議來做,因爲我的實際類名是CLASS_NAME和字符串的串聯。我嘗試使用'\ class MyClass',但似乎沒有任何文檔生成。這可能是因爲Doxygen搜索MyClass但沒有找到它?我也嘗試過'\ class CLASS_NAMEConcatenatedString',但是又一次:什麼都沒有。 – AbuBakr

1

我會建議把生成的類放在一個單獨的頭文件中,只是記錄頭文件。在最好的情況下,生成的類更多的是實現細節。

另一種選擇是編寫腳本。無論是使用你最喜歡的腳本語言,或者像cheetah這樣的東西都不會太糟糕。

我猜你的發電機看起來很簡單,生成鍋爐板或特徵或任何東西。

GENERATE_CLASS(Foo); 
GENERATE_CLASS(Bar); 

這樣的事情是非常合理的grep飼料。

+0

我不確定是否正確理解了第一段。你是否建議創建一個包含預處理器輸出的示例頭文件?如果這個頭可以自動創建,這只是一個很好的解決方案。由於我使用cmake,這可能是可能的。然後我可以使用sweetrommie的建議在generator.h中創建註釋。 – AbuBakr

+0

在第一段中,我不是指生成的輸出。我的意思是把代碼分離成它自己的頭文件。然後給出一般使用的執行摘要,而不是類的細節。另一種選擇是創建一個純虛擬接口,使所有生成的類「繼承」(無論是從字面上還是從模仿中),並將其記錄下來。如果你想生成一些東西,我會使用獵豹。 –

4

在我寫作的時候,Doxygen 執行全面的文件包含,只要有幾個條件成立。從Doxygen internals documentation

...預處理器解析,但實際上沒有包括代碼時 遇到的#include (用#include發現裏面{ 例外吧...}塊)

的其他未公開的,但直觀的前提我已經通過實驗發現是,無論{...}塊中的#include是本身必須記錄在案。例如,使用Boost.Preprocessor在以下測試文件上運行Doxygen將生成結構FOO::A,FOO::BFOO::C的條目,前提是在配置文件中啓用了MACRO_EXPANSION,所需的提取模式設置爲「所有實體」,並且增強文件夾正確設置在INCLUDE_PATH

#include <boost/preprocessor/iteration/local.hpp> 
#include <boost/preprocessor/tuple/elem.hpp> 

#define STRUCTS (A, B, C) 

namespace FOO { 
    #define BOOST_PP_LOCAL_MACRO(n) struct BOOST_PP_TUPLE_ELEM(3,n, STRUCTS) {}; 
    #define BOOST_PP_LOCAL_LIMITS (0,2) 
    #include BOOST_PP_LOCAL_ITERATE() 
} 

但是,刪除FOO放置結構在一個匿名的命名空間將導致沒有文檔。所以,如果你能忍受在一個明確的名字空間內的#include "generator.h",它將工作。

+0

我不確定關於記錄#include指令所在塊的第二個前提條件。我相信這不是必需的。 – Heyji