ブロックの場合version
、ドキュメントに記載されるのは使用されるバージョンのみです(最初のバージョンか最後のバージョンか、またはその間のいずれか)。したがって、たとえば、version
Linux用のブロックとWindows用のブロックがある場合、コンパイルするシステムに一致するものだけがドキュメントに表示されます。
static if
テンプレートの外側のブロックも同じように機能するようです。それらがコンパイルされている場合、それらのddocコメントはドキュメントに含まれますが、コンパイルされていない場合、それらはコンパイルされません。
ただし、テンプレート内static if
のブロックは、常に最初の静的ifブロックからドキュメントを取得しているように見えます。ただし、これらの静的ifが(テンプレートのさまざまなインスタンス化から)との両方になる可能性があり、コンパイラーは、ddocコメントが生成されたドキュメントに含まれるようにテンプレートをインスタンス化する必要がないことを考慮すると、それは理にかなっています。テンプレート外のブロックのように正しい答えは1つありません。false
true
false
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
また、あなたがやろうとしていたことがうまくいったとしても、まったく同じ署名で異なるコメントで2回そこにたどり着いたので、ドキュメントでは非常に奇妙に見えることにも注意してください。はドキュメントにまったく含まれないため、どのような状況で存在したstatic if
かを知る方法はありません。どういうわけか2回foo
宣言したように見えます。foo
状況はテンプレートの制約と似ています。制約はドキュメントに記載されていないため、制約によってのみオーバーロードされるテンプレート化された関数を処理する場合、各関数のオーバーロードを文書化することは意味がありません。
ただし、必要のない場所の1つ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
、ドキュメントを生成する以外の目的でコードをコンパイルすることは意味がなく、実行する実際の実行可能ファイルは、別のビルドで生成する必要があります。 tを使用します-D
。それを回避するために完全なコードをブロックに入れることができversion(D_Ddoc)
ますが、それはコードの複製を意味し、実際にはでは機能しませんstatic if
。Phobosはversion(StdDdoc)
代わりに(それ自体で定義する)を使用するため、ブロックをversion(D_Ddoc)
使用しない場合でも、Phobosでversion(D_Ddoc)
コンパイルして動作させることができますが、使用を開始すると、ドキュメントとは別にドキュメントを生成する必要があります。通常のビルド。-D
version(D_Ddoc)