2010-04-15 14 views
8

Ich habe versucht, mein C++ - Projekt mit Doxygen zu dokumentieren, mit wenig Erfolg: Doxygen erkennt bestimmte Makros nicht und folglich werden ganze Funktionen falsch interpretiert und die meiste Zeit erzeugt keine Dokumente, obwohl sie spezielle Kommentarblöcke haben . Typischer Fall:Doxygen korrekt verwenden

/** 
* \def  __MYLIB_FUNCTION_ATTRIBUTE(...) 
* \brief Some brief comment 
* \details Detailed doc 
* \sa  Some valid references 
*/ 
#define __MYLIB_FUNCTION_ATTRIBUTE(...) __attribute__(__VA_ARGS__) 

/** 
* \def  IN 
* \brief Tag for input arguments to a function 
* \details Blah... 
* \sa  OUT 
*/ 
#define IN 

/** 
* \def  OUT 
* \brief Tag for output arguments to a function 
* \details Blah... 
* \sa  IN 
*/ 
#define OUT 

class MyClass { 
public: 

    /** 
    * \fn  MyClass() 
    * \brief  Constructor for MyClass 
    * \details Hi! 
    */ 
    __MYLIB_FUNCTION_ATTRIBUTE(__always_inline__) 
    MyClass() { 
    } 

    /** 
    * \fn  const char *doNothing(const char *s IN) 
    * \brief  A weird function 
    * \details Some very weird doc 
    * \param[in] s No good parameter 
    */ 
    const char* __SXC_FUNCTION_ATTRIBUTE(__const__) doNothing(const char *s IN) { 
     return s; 
    } 
}; 

Dokumentation für die obige Klasse erzeugt wird, immer eine Beschreibung für doNothing und IN fehlt als Funktion interpretiert! Mache ich hier etwas falsch?

+0

Was sind die Werte von MACRO_EXPANSION et al. (http://www.doxygen.nl/config.html#cfg_macro_expansion) in Ihrer Konfigurationsdatei? –

+0

@Eric: Ich glaube, du hast das Problem sofort erkannt! MACRO_EXPANSION ist auf YES gesetzt, aber muss ich auch zusätzliche Include-Verzeichnisse angeben? Derzeit werden alle verwendeten Header auch von Doxygen verarbeitet. Ich werde den Rest der Parameter überprüfen und auf Sie zurückkommen. – themoondothshine

+0

Hier sind die Konfigurationsparameter erstellt: 'ENABLE_PREPROCESSING = YES MACRO_EXPANSION = YES EXPAND_ONLY_PREDEF = NO SEARCH_INCLUDES = zu bejahen ist – themoondothshine

Antwort

4

Zwei Dinge:

1) Der Doxygen-Parser "sehen", nicht den "IN" in DoNothing (da es in der Vorlaufphase) entfernt wird, so dass der \ fn nicht enthalten soll: const char* doNothing(const char* s). Übrigens ist dies nicht notwendig: Doxygen ordnet den Kommentar automatisch zu, wenn er sich unmittelbar vor der dokumentierten Entität befindet.

2) Ich weiß nicht, was __SXC_FUNCTION_ATTRIBUTE expandiert, aber wenn es ähnlich wie __MYLIB_FUNCTION_ATTRIBUTE ist, verwirrt es wahrscheinlich Doxygen.

#ifdef DOXYGEN 
// Doxygen does not grok the normal definition of this 
#define __MYLIB_FUNCTION_ATTRIBUTE(...) 
#else 
#define __MYLIB_FUNCTION_ATTRIBUTE(...) __attribute__(__VA_ARGS__) 
#endif 

und setzen PREDEFINED = doxygen in Ihrer Konfigurationsdatei: Zur Umgehung des Problems können Sie entweder diese Makros nichts im PREDEFINED Abschnitt von Doxygen config-Datei oder bedingt definieren sie in den Quellen, wie diese definieren.

+0

@Eric: Awesome !! Ihre Lösung hat wie ein Kinderspiel funktioniert! Das ist definitiv ein +1. Vielen Dank. – themoondothshine