사용자 도구

사이트 도구


사이드바

카테고리

tool:doxygen

독시젠을 사용해서 코드에 문서를 남기는 방법을 정리한다.

잘 활용해서 문서 작성 압박에서 조금이라도 벗어나보자.

독시젠 기본 매뉴얼

  • 독시젠 매뉴얼 링크 : http://www.doxygen.nl/manual (영문)
  • 하단의 링크가 깨진 경우, 위 주소에서 다시 찾아보면 나옴

독시젠 사용한 샘플

doxygen 주석 방식

주석 형식의 기본

내 손에 가장 익은 방식

///\독시젠키워드
/// 위의 키워드에 대한 이어지는 설명

또는, 여러 키워드를 입력해야 하는데 /// 를 타이핑 하기 귀찮은 경우

/*!
\독시젠키워드
*/

또는,

/*!
@독시젠키워드
*/

@로 시작되는 독시젠 키워드는 phpdoc에서 인식하므로 (다른 것도 인식하지만), 이쪽이 좀 더 범용이 아닐까 싶다.

이후에는 전부 @나 \를 사용해서 작성한다.

독시젠 키워드가 선언된 이후부터는

  • 다음 독시젠 키워드가 나올때 까지
  • 주석이 끝나는 완전히 전부 부분까지

이전에 선언된 독시젠 키워드에 해당 되는 설명으로 읽혀진다.

/*!
 * @breif 
 * 여기부터는 '\\brief'에 대한 설명으로 모두 포함된다.
 * 줄을 끊어서 쓰더라도 한줄로 정리 된다.
 * @return 새로온 독시젠 키워드가 나왔으므로 이전 brief에 대한 읽기는 끝나게 되고 
 * return에 해당되는 주석으로 읽혀진다.
 */

Class에 대해서

///@brief 아래 클래스에 대한 설명
class TestClass
{
public:
  LONGLONG  llSomeVal; ///< 롱롱 타입의 변수
  int       nSomeVal; ///< 인티져 타입의 변수
};
  • 클래스 위에 적는 경우라면 이 키워드는 필요 없다.
  • 변수에 대해서 설명을 추가할 때는, ///< 를 그대로 사용해야 변수 주석으로 인식한다.
///\class AbcdClass filename.h "inc\filename.h"
///\brief 뭐 소스 위에 적지 않는 경우 쓰는거지.
  • \class 키워드는 클래스 위에 적지 않고 다른 위치에 적는 경우, 무엇을 위한 키워드인지 알려주기 위해서 적는다.

class, file, 함수에 대해서,

각각의 소스 바로 위에 쓰지 않고 다른 곳에 쓸 수도 있는데, 주석이 너무 많아져서 코드 보는 것이 힘들어지는 경우 주석 부분만 다른 곳으로 옮겨 독시젠 문서에 포함되게끔 할 수 있는 쓸데없는 기능.

멤버 변수에 주석 달기

class IamTheClass
{
  int k; ///< 이건 멤버 변수야. 로컬 변수의 주석은 무시당한다.
  void int kkk()
  {
    int mm; ///< mm 이라는 로컬 변수야. 독시젠이 난 무시할거야.
  }
}

기타

///\brief RootThree를 위해서 사용될 콜백 함수
typedef bool (__stdcall *CALLBACKFUNCTYPE)(IN RootThree*, IN void*);

함수를 위한 키워드

함수용 키워드들

/*!
 * @brief  함수에 대한 설명. (한줄 이상) 다음 키워드가 나올때까지 '///' 다음의 문장을 brief의 문장으로 인식한다.
 * @details  결과 모르지만, 추가 설명이 필요하면 사용하라는 키워드. (more)를 눌렀을때 보여줄 텍스트.
 * @param[in]	파라미터 이름	파라미터 설명, [in]은 입력용 파라미터라는 뜻.
 * @param[out]	파라미터 이름	파라미터 설명, [out]은 입력용 파라미터라는 뜻.
 * @return	리턴값에 대한 설명, 리턴 값이 여럿이라 추가 설명이 필요하면 retval을 사용한다. '\returns'와 같다.
 * @retval	리턴값	리턴 값에 대한 설명. 
 * @bug		알고 있는 버그에 대해서 적는다.
 * @todo		todo에 대해서 적는다. 
 * @warning	주의 사항에 대해서 적는다.
 * @see '다른 파일 이름'을 적는다. 다른 곳을 참조하라고 할때 쓰는데.. 직접  써본적은 없어서.
 */
// 독시젠에서 확인한 예제
/*!
 * @brief 독시젠에서 함수 설명이 제대로 만들어지는지 확인하기 위한 함수.
 * @details 'more'를 누르면 보여지는 설명.
 * @param[in] aa 입력용 숫자값
 * @param[in] bb 입력용 char 값
 * @param[out] dd 출력용 버퍼
 * @return 리턴용 값에 대한 설명
 * @retval -1 실패
 * @retval 0 성공
 * @retval 1 성공+뭔가 더
 * @bug 이 함수에서 가끔 뻗는데 아직 이유를 모른다.
 * @warning 이 함수에서 가끔 뻗는데 아직 이유를 모른다.
 * @see OUT_GRP_TEST
 * @ref page2
 */
int DoxyFuncTest( int aa, char bb, char* dd );

기타

?? 이건, 왜 적을걸까????

///@brief RootThree를 위해서 사용될 콜백 함수
typedef bool (__stdcall *CALLBACKFUNCTYPE)(IN RootThree*, IN void*);

예제 1

  • 설명을 작성하기 전에 코드 예제
  • 샘플 파일 (독시젠 설정 파일 포함) : 문서 맨 위에 있음.
/*!
 * @file CppTest.cpp
 * C++ 문법과 DoxyGen 문법을 테스트하기 위한 코드
 */
#include "stdafx.h"
#include <iostream>
#include <conio.h> ///< getch() 함수를 사용하기 위해서 포함되었다.
 
using namespace std;
 
////////////////////////////////////////////////////////////////////////////
 
/*!
 * @mainpage C++ & DoxyGen 문법 테스트
 * C++과 독시젠 문법을테스트하기 위한 정보
 * @section intro_sec Introduction
 * This is the introduction.
 * @section install_sec Installation
 * @subsection step1 Step 1: Opening the box
*/
 
////////////////////////////////////////////////////////////////////////////
 
///@page page1 A documentation page
///@tableofcontents
/// Leading text.
///@section sec An example section
/// This page contains the subsections \ref subsection1 and \ref subsection2.
/// For more info see page \ref page2.
///@subsection subsection1 The first subsection
/// Text.
///@subsection subsection2 The second subsection
/// More text.
 
///@defgroup ROOT_INIT Root* 클래스를 초기화 하는 함수들
///
///@defgroup VIRTUAL_TEST virtual 기능을 테스트 하기 위한 함수들
///
///@defgroup GLOBAL_FUNC 클래스에 속하지 않는 외부 함수들
///
///@defgroup OUT_GRP_TEST 외부 그룹에 속하는 함수 테스트
///
 
////////////////////////////////////////////////////////////////////////////
 
/*!
 * @page page2 Another page
 * @Even more info.
 */
 
///@static
static int _varG = 0; ///< 스태틱 상태값
 
///@brief 최상단 루트 클래스
///@ingroup VIRTUAL_TEST
class RootZero
{
public:
  ///@brief 소멸자 클래스로, 함수 이름을 출력하고 종료한다.
  virtual ~RootZero()
  {
    cout << __FUNCTION__ << endl;
  }
  ///@brief virtual 기능 확인용 테스트 함수.
  /// child 클래스에서만 사용하도록 virtual pure 로 선언된다. 
  ///@ingroup ROOT_INIT 
  virtual bool initHandler() = 0;
};
 
///@class RootOne
///@brief RootZero로 부터 상속된 테스트 클래스 2
///@ingroup VIRTUAL_TEST
class RootOne : public RootZero
{
public:
  RootOne()
  {
    cout << __FUNCTION__ << endl;
  }
  virtual ~RootOne()
  {
    cout << __FUNCTION__ << endl;
  }
 
  ///@brief virtual 기능 확인용 테스트 함수. 함수 이름을 출력하고 종료한다.
  ///@ingroup ROOT_INIT 
  virtual bool initHandler()
  {
    cout << __FUNCTION__ << endl;
    return true;
  }
 
  int mnTest; ///< 테스트용 인티져값
};
 
///@brief RootOne로 부터 상속된 테스트 클래스 3
///@ingroup VIRTUAL_TEST
class RootTwo : public RootOne
{
public:
  RootTwo()
  {
    cout << __FUNCTION__ << endl;
  }
  virtual ~RootTwo()
  {
    cout << __FUNCTION__ << endl;
  }
 
	///@brief virtual 기능 확인용 테스트 함수. 
	/// 부모 클래스의 같은 함수를 실행하고 그 뒤에 함수 이름을 출력하고 종료한다.
	///@ingroup ROOT_INIT 
	virtual bool initHandler()
	{
		if( ! __super::initHandler() ) return false;
		cout << __FUNCTION__ << endl;
		return true;
	}
};
 
///@brief RootTwo로 부터 상속된 테스트 클래스 4
///@ingroup VIRTUAL_TEST
class RootThree : public RootTwo
{
public:
  RootThree()
  {
    cout << __FUNCTION__ << endl;
  }
  virtual ~RootThree()
  {
    cout << __FUNCTION__ << endl;
  }
 
  ///@brief virtual 기능 확인용 테스트 함수. 
  /// 부모 클래스의 같은 함수를 실행하고 그 뒤에 함수 이름을 출력하고 종료한다.
  ///@ingroup ROOT_INIT 
  virtual bool initHandler()
  {
    if( ! __super::initHandler() ) return false;
    cout << __FUNCTION__ << endl;
    return true;
  }
 
  ///@ingroup OUT_GRP_TEST 
  int Grp1() {}
  int Grp2() {}
 
  ///@defgroup DOXY_MEMBER_GROUP 독시젠 그룹핑 테스트
  ///@{
  void Grp3() {}
  void Grp4() {}
  ///@}
 
  int mnABC; ///< abc int 변수
  int mnDEF; ///< a var in group OUT_GRP_TEST
 
  ///@brief 독시젠에서 함수 설명이 제대로 만들어지는지 확인하기 위한 함수.
  ///@details 'more'를 누르면 보여지는 설명.
  ///@param[in] aa 입력용 숫자값
  ///@param[in] bb 입력용 char 값
  ///@param[out] dd 출력용 버퍼
  ///@return 리턴용 값에 대한 설명
  ///@retval -1 실패
  ///@retval 0 성공
  ///@retval 1 성공+뭔가 더
  ///@bug 이 함수에서 가끔 뻗는데 아직 이유를 모른다.
  ///@warning 이 함수에서 가끔 뻗는데 아직 이유를 모른다.
  ///@see OUT_GRP_TEST
  ///@ref page2
  int DoxyFuncTest( int aa, char bb, char* dd );
 
  /*!
   * @fn int DoxyFuncTest2( int aa, char bb, char* dd )
   * @brief 독시젠에서 함수 설명이 제대로 만들어지는지 확인하기 위한 함수.
   * @details 'more'를 누르면 보여지는 설명. \\fn 은 함수 위에 주석을 달지 않을때 쓰는 기능.
   * @param[in] aa 입력용 숫자값
   * @param[in] bb 입력용 char 값
   * @param[out] dd 출력용 버퍼
   * @return 리턴용 값에 대한 설명
   * @retval -1 실패
   * @retval 0 성공
   * @retval 1 성공+뭔가 더
   * @bug 이 함수에서 가끔 뻗는데 아직 이유를 모른다.
   * @warning 이 함수에서 가끔 뻗는데 아직 이유를 모른다.
   * @see OUT_GRP_TEST
   * @ref page2
   * @example CppTest.cpp
   * 이 함수의 예제.
   * char _buf[100];
   * DoxyFuncTest2( 1, 'a', _buf );
   */
  int DoxyFuncTest2( int aa, char bb, char* dd );
};
 
 
////////////////////////////////////////////////////////////////////////////
 
///\brief Root계열 클래스를 생성한다. 그리고 리턴.
///\return RootZero* 타입으로 생성된 포인터를 리턴한다.
RootZero* getRootClassPtr()
{
  return new RootThree;
}
 
///@brief 프로그램 시작 지점
///@param[in] argc 실행시 넘겨지는 파라미터의 개숫
///@param[in] argv 실행시 넘겨지는 파라미터 문자열 리스트
///@return 프로그램의 실행 결과값.
///@warning 워닝 경고문 테스트
///@ingroup GLOBAL_FUNC
int _tmain(int argc, _TCHAR* argv[])
{
  RootZero* _ptr = getRootClassPtr();
  _ptr->initHandler();
 
  _getch();
 
  delete _ptr;
 
  _getch();
 
  return 0;
}

예제 2

doxygen 키워드와 ms-xml로 작성된 클래스 설명 부분.

여러가지 재미 있는 키워드가 활용 되었다. 결과 화면은 더 아래쪽에.

/// <summary>
/// 로그를 출력할 윈도우를 만든다.<br/>
/// log() 와 watchValue() 를 실행할때 init() 함수를 호출해서 로그 파일과 GameObject 를 만든다.
/// </summary>
/// 
/// <example>
/// 스태틱 객체가 아니므로, 어느 오브젝트엔가는 붙여서 사용해야 한다.
/// 그 후에는 static으로 정의된 몇 함수를 사용해서 로그를 남기면 된다.
/// 
/// @code{.cs}
/// Console.log( "일반 로그" ); // 콘솔버퍼, 파일에 메시지를 남기고, Debug.Log()는 옵션 플래그에 따라 넣는다.
/// Console.debug( "디버그용 로그" ); // Debug.Log()에도 메시지를 출력한다. Debug.Log() 메시지를 한번에 빼기 위한 용도로 만들었다.
/// @endcode
/// 
/// 이외에도 변수 와치 기능을 사용해서, 어떤 값이 어떻게 변해가는지 화면의 어느 고정된 위치에 표시한다.<br/>
/// 값이 추가되는대로 자동으로 늘어나서 표시된다.
/// 
/// @code{.cs}
/// Console.watchValue( "변수 또는 키이름", 값 );
/// @endcode
/// </example>
/// 
/// <remarks>
/// <para>코딩 가이드</para>
/// 
/// <list type="bullet">
/// <item><description>
/// GUI 스크립트 가이드 : http://docs.unity3d.com/Documentation/Components/GUIScriptingGuide.html
/// </description></item>
/// <item><description>
/// GUI 레이아웃모드 : http://docs.unity3d.com/Documentation/Components/gui-Layout.html
/// </description></item>
/// </list>
/// 
/// <para>사용한 함수 레퍼런스</para>
/// <list type="bullet">
/// <item><description>
/// GUILayout : http://docs.unity3d.com/Documentation/ScriptReference/GUILayout.html 
/// </description></item>
/// <item><description>
/// GUILayout.Window() : http://docs.unity3d.com/Documentation/ScriptReference/GUILayout.Window.html
/// </description></item>
/// <item><description>
/// GUILayout.Box() : http://docs.unity3d.com/Documentation/ScriptReference/GUILayout.Box.html
/// </description></item>
/// <item><description>
/// GUILayout.BeginScrollView() : http://docs.unity3d.com/Documentation/ScriptReference/GUILayout.BeginScrollView.html
/// </description></item>
/// <item><description>
/// GUI Controls : http://docs.unity3d.com/Documentation/Components/gui-Controls.html
/// </description></item>
/// </list>
/// </remarks>
/// @todo 텍스트 입력필드도 넣어서 입력을 받아서 대응 되도록 하는 것.
public class Console : MonoBehaviour
{
}
위의 주석의 샘플

기타

Page 와 Section

  • Page 를 만들고 다른 페이지와 연결 되도록 링크 구성
  • 각 페이지는 섹션과 서브 섹션으로 구성
  • 최종 tableofcontents 키워드로 최종 챕터 정리 가능
  • 아래 Markdown 과 함께 사용 되어, 코드 문서화이외의 문서 작업이 가능할걸??

갈수록 링크가 늘어나는 독시젠 문서화 설명 : php 마크업

PAGE, SUBPAGE

  • mainpage : 최초로 보여지는 페이지 설정
  • subpage : 이동할 다른 페이지의 링크 설정
// 아래 내용이 모두 한 파일에 있어도, 각 다른 페이지를 만들어준다.
 
/*!
@mainpage I am THE Main
 
이 문서의 다른 페이지에 대해서
- @subpage intro 
- @subpage advanced
*/
 
/*!
@page intro 일반사용
일반 사용에 대한 문서
*/
 
/*!
@page advanced "고급사용"
일반 사용에 대한 문서
*/

Section, SubSection

이런 관계인 것은 알겠는데

  • Section
    • subsection
    • subsection

#, ##, ##로 사용되는 헤더1, 헤더2, 헤더3 같은거랑 무슨 차이가 나는지 잘 모름.

section, subsection은 파라미터가 2개 사용하는 것 주의

  • @section <section-ref-name> <section-text>
  • @subsection <section-ref-name> <section-text>
/*!
@section first_section 첫번째 섹션
첫번째 섹션 내용
 
@subsection first_sec_sec1 첫 섹션의 서브 섹션
첫번째 서브 섹션
 
@subsection first_sec_sec2 첫 섹션의 두번째 서브 섹션
두번째 서브 섹션
*/

tableofcontents

아직은..

예제

/*!
@mainpage I am THE Main

이 문서의 다른 페이지에 대해서
- @subpage intro 
- @subpage advanced

@section first_sec 섹션1

@subsection steam_subsec 실행 방법 (쓸게 없어서)

# 스팀 실행 방법

- 컴터를 켠다
- 윈도우즈에 들어간다.
- 스팀을 켠다.

## 스팀에서 게임 실행 방법

- 아 쓸게 없어서..
  1. 스팀에서 목록을 확인한다.
	2. 업데이트를 확인한다.

@subsection table_usage 테이블 추가 방법

첫째헤더  | 둘째헤
------------- | -------------
셀 내용  | Content Cell 
() | Content Cell 
셀 | 셀 6

내용이 비어있는 셀은 인식되지 않는다.
	
*/

/*!
@page intro 일반사용
일반 사용에 대한 문서

*/

/*!
@page advanced 고급사용
일반 사용에 대한 문서
*/

Markdown : 추가 문서 작업

코드에 설명을 추가하는 것만으로는 문서화가 부족한데, 추가 설명을 위키를 작성하는 것처럼 쓸 수 있는 Markdown 키워드가 지원된다.

단락 구분

한줄 비워두는 것으로 단락과 단락을 구분

첫번째 단락입니다.

두번째 단락입니다. 단락이 새로 시작됩니다.

헤더(목차)

첫번째 두번째 목차까지 지원.

첫번째 헤더
===========

두번째 헤더
-----------
  • 헤더 키워드는 스트링 길이만큼 필요하지 않고, 2개 이상이면 됩니다.

1~6까지 지원하는 키워드도 있는데 # 키워드를 씁니다.

# 첫번째 헤더 
### 3번째 헤더 

인용문

> 인용문의 시작.
> spanning multiple lines

뭔가 하나 더 있는데, 이해 안됨.

리스트(목록)

  • 단순히, +, -, * 로 시작되면 목록 형식으로 변환됨
  • 더 하위 리스트는 탭으로 인덴트 해주면 하위 항목으로 인식됩니다.
- Item 1

  More text for this item.

- Item 2
  + nested list item.
  + another nested item.
- Item 3

숫자형 리스트를 사용할 수도 있다. 숫자를 그대로 쓰라

1. First item.
2. Second item.

코드

코드는 단락을 구분 지은 다음, 공백 4칸을 사용하면 만들 수 있다.

This a normal paragraph

    This is a code block

We continue with a normal paragraph again.

또는

1.  List item

    Not an indented code block, but a second paragraph
    in the list item

~~~~{.cs}
This is a code block, fenced-style
~~~~

간단한 코드 추가

(`) 키워드로 간단한 코드 효과를 넣을 수 있다.

Use the `printf()` function.

테이블

기본

First Header  | Second Header
------------- | -------------
Content Cell  | Content Cell
Content Cell  | Content Cell

셀 내부 정렬

| Right | Center | Left  |
| ----: | :----: | :---- |
| 10    | 10     | 10    |
| 1000  | 1000   | 1000  |

DoxyWizard

직접 doxygen을 쓰는 것보다는 doxywizard로 옵션을 수정하는게 덜 피곤한 것 같다.

PRE.PROCESSOR

프로그램 메뉴 상의 위치 Expert > Preprocessor ( 독시젠 PreProcessing 부분)

ENABLE_PREPROCESSING 옵션을 켜야, PreProcessor를 인식하는데 이 지시문 때문에 파일 전체가 문서화 되지 않을 수도 있어서 주의가 필요

  • ENABLE_PREPORCESSING : check! 적용하고 싶다면,

#if some_define과 같이 Preprocessor를 사용했는데 문서화가 되지 않는다면

  • PREDEFINED 섹션에 사용하려는 지시문을 (적당히) 넣는다.
  • 더 나이스한 방법은 모르겠고, 일단 이 방법으로 문서화가 된다.

Unity3D (C#)를 위한 설정

Doxygen Config 펼치기

그래프 표시 : Graphviz

윈도우라면 설치 버젼이 제공되므로, 뭐 걍 설치하면 끝.

키워드 (c comment style)

주석은 javadoc 스타일로 작성해도 인식 하므로, 일단 패스 doxygen이 인식하는 키워드 정리 ; 인터넷에 널려 있다.

  • 간단하게는 ///이게 제일 편할 듯
  • 복수의 키워드를 사용하려면 /*! ~ */ 와 같은 것을 쓴다.
/*!
 * @brief 설명, 
 * @brief  (공백)여러줄 작성시에는 공백을 추가해서 적는다. 불편하네..
 * @file 파일명 
 * @return 
 * @author
 * @date 작성날짜
 * @param 파라미터
 * @see 참고할 함수나 페이지
 * @todo 다음에 할일
 * @bug 
 * @code 코드로 쓰는 설명 부분 시작
 * @code 코드 부분 종료
 */

독시젠 웹 레퍼런스

제대로 사용하려면 가기 싫어도 자주 가게 되는데...

MS XML Documentation Comment

C#으로 작성할때는 MS 스타일이 자동 입력 되니, 사용할 수 있는 것을 정리한다. 귀찮지만, 한번 정리해보자.

Doxygen도 MS 형식의 문서화를 지원하니까, 이쪽을 써도 안심
  • MS는 xml 형식으로 주석 문서화가 가능하다.
  • /// 로 시작되는 부분이 문서화가 되어지는 부분.
    ///
  • <키워드> ~ </키워드> : 의 형식으로 문서화 가능.
    /// <summary> 함수에 대한 설명
    /// </summary>
  • <summary></summary> 키워드는 한줄에 다 같이 사용 되면 인식 되지 않는다.
    /// <summary> 주석 </summary> <-- 이렇게 쓰면 인식되지 않아요.

<키워드> 내부에 <, >를 써야 하는 경우에는 html 처럼 &lt;&gt;를 사용한다.

/// <summary cref="C &lt; T &gt;">
/// </summary>

주석 혼합 사용

MS xml 태그로 주석을 추가한 다음, DoxyGen 형식으로 부족한 부분을 추가해도 인식 된다.
/// <summary>
/// 새게임을 시작한다.
/// AppFlowHandler 에서 호출 되어서 게임을 시작된다. 보드를 초기화 하고,
/// 뷰에 메시지를 보낸다.
/// </summary>
/// <param name="startParam">시작할 때 필요한 정수 옵션을 받아둔다.</param>
/*!
 * @param secParam 두번째 파라미터에 대해서 입력한다.
 */

링크

키워드

작성하다보면 자동으로 사용할 키워드를 보여주기 때문에 일단은 필요 없지만.. 그래도 정리해두는 편이 찾기 편할 테니.

<c> 코드를 가리킨다. 한줄 이상은 <code>를 사용한다.
<code> 한줄 이상의 코드
cref 코드레퍼런스를 가리킨다. <see cref="TestClass"/> 처럼 사용.
<para> <summary>, <remarks> 또는 <returns> 같은 태그 내에서 사용하여 텍스트에 구문을 추가할 수 있다.
단락을 추가할때는 이 태그를 써야 한다는 귀찮은 태그다.
<see> cref와 같이 사용해서, 어덴가의 코드를 가리킨다.
<param> 말그대로 파라미터
<seealso> 문서화하려는 대상 파일들에 있는 멤버 함수, 멤버 변수와 같은 필드에 대한 참조를 만든다.
출력 XML에서 member를 요소 이름에 전달하는지 확인합니다. member는 큰따옴표(“ ”)로 묶어야 합니다.
텍스트 내부에서 링크를 지정하려면 <see>를 사용합니다. ←- 무슨뜻?
<see> <seealso>와 같은데 뭐가 다르지?
<example> 링크
<paramref>
<summary> 함수에 대한 설명
<exception> 예외 처리에 대해서 기록. link
<permission>
<typeparam>
<include> 함수 설명이 다른 파일에 있는 경우, 이 지시문으로 해당 파일을 기록한다.
<remarks> 링크
<summary>에 대한 보충설명을 추가한다. 아마 표시하는 위치가 다른 모양.
<typeparamref> 링크
<list> 아래쪽 참조
<returns> 함수 리턴 값에 대해서 추가 설명
<value> 좀 이상하지만, get/set으로 설정하는 프로퍼티에 대해서 주석을 넣는다.

<list>에 대한 예제

<list type="bullet" | "number" | "table">
    <listheader>
        <term>term</term>
        <description>description</description>
    </listheader>
    <item>
        <term>term</term>
        <description>description</description>
    </item>
</list>

TAG

덧글 피드백

tool/doxygen.txt · 마지막으로 수정됨: 2020/06/30 10:45 저자 kieuns