2012-09-22 4 views
3
/** This is struct S. */ 
struct S(T) { 

    static if(isFloatingPoint!T) 
    { 
    /// This version works well with floating-point numbers. 
    void fun() { } 
    } 
    else 
    { 
    /// This version works well with everything else. 
    void fun() { } 
    /// We also provide extra functionality. 
    void du() { } 
    } 
} 

if``정적이있는 경우 문서를 생성하는 방법 문서는 첫 번째 블록으로 만 생성됩니다. else 블록도 생성하려면 어떻게해야합니까?<code>dmd -D</code>로 컴파일

답변

3

version 블록의 경우 문서에서 끝나는 버전 만 사용됩니다 (처음이나 마지막으로 또는 어느 쪽이든간에). 예를 들어, Linux 용 블록과 Windows 용 블록이 모두 version 인 경우 컴파일 한 시스템과 일치하는 블록 만 문서에 저장됩니다.

static if 템플릿 외부의 블록이 동일한 방식으로 작동하는 것 같습니다. 컴파일 된 경우 ddoc 주석은 문서로 끝나지 만 컴파일되지 않으면 ddoc 주석이 컴파일되지 않습니다.

그러나, static if 블록 내부 템플릿은 항상 false 항상하더라도, 만약 블록 최초의 정적에서 문서를 잡을 것으로 보인다. 하지만 그 정적 ifs가 truefalse (템플릿의 다른 인스턴스화에서)이 될 수 있고 컴파일러는 생성 된 문서에서 ddoc 주석이 끝나기 위해 실제로 템플릿을 인스턴스화 할 필요가 없다는 것을 고려하면 감각. 템플릿 외부에있는 static if 블록과 같은 올바른 대답은 하나도 없습니다.

에 관계없이, 그들이 조건부 컴파일을 사용하여 수도 있고 컴파일되지 않을 수있어 정확하게 있기 때문에, 일반적으로 version 블록 또는 static if의 내부 문서를 넣어 나쁜 생각입니다.이 솔루션은 version(D_Ddoc) 블록을 사용하는 것입니다. 그래서, 당신은이 같은 끝낼 것 :

나는 또한 당신이 일을하려고했다하는 것은 근무했다하더라도 당신이 종료 한 것이기 때문에, 그것은, 문서 매우 기괴한 보일 것이다주의 할
/// This is struct S 
struct S(T) 
{ 
    version(D_Ddoc) 
    { 
     /// Function foo. 
     void fun(); 

     /// Extra functionality. Exists only when T is not a floating point type. 
     void du(); 
    } 
    else 
    { 
     static if(isFloatingPoint!T) 
      void fun() { } 
     else 
     { 
      void fun() { } 
      void du() { } 
     } 
    } 
} 

foo와 정확히 같은 서명이지만 다른 설명이 두 번 있습니다. static if은 문서에 전혀 포함되지 않으므로 어떤 상황에서 알 수있는 방법이 없습니다. foo. 어떻게 든 두 번이나 foo을 신고 한 것처럼 보일 것입니다.

상황은 템플릿 제약 조건과 비슷합니다. 제약 조건은 문서에서 끝나지 않으므로 제약 조건에 의해서만 오버로드되는 템플릿 함수를 처리 할 때 각 함수 오버로드를 문서화하는 것은 의미가 없습니다.

version(D_Ddoc)이 필요없는 곳은 일련의 version 블록에서 동일한 기능을 수행하는 경우입니다. 예 :

/// foo! 
version(linux) 
    void foo() {} 
else version(Windows) 
    void foo() {} 
else 
    static assert(0, "Unsupported OS."); 

없이 생성 된 문서에 끝납니다 ddoc 주석은 어느 version 블록에서 컴파일된다.

version(D_Ddoc) 블록의 사용 -D를 사용할 때 그렇게 할 경향이 알아야한다

그것을 실제로 문서를 생성하는 것 이외의 다른 목적으로 코드를 컴파일하는 것은 의미가 없으며 실행하는 실제 실행 파일은 -D을 사용하지 않는 별도의 빌드에 의해 생성되어야합니다. 수 있습니다version(D_Ddoc) 블록에 전체 코드를 넣어,하지만 코드 복제를 의미하고, 그것은 실제로는 static if와 함께 작동하지 않을 것입니다.Phobos는 version(D_Ddoc) 대신 version(D_Ddoc) 블록을 사용하지 않고 -D을 사용하여 컴파일하고 Phobos를 사용할 수 있지만 version(D_Ddoc)을 사용하기 시작한 후에는 생성해야합니다. version(D_Ddoc) 대신 version(StdDdoc)을 사용합니다. 일반 빌드와 별도로 문서를 작성하십시오.

관련 문제