2

Delphi で欠けている機能の 1 つ (それが可能であることを願っています) は、ユニットに依存するユニットを自動的に含めることができないことです。これは、C++ ヘッダーで可能です。たとえば、C++ では次のようになります。

従属ヘッダー.h:

#include "baseHeader.h"

baseHeader.h に含まれるすべてのヘッダーは、dependentHeader.h で使用できます。もう 1 つの例はプリコンパイル済みヘッダーです。プリコンパイル済みヘッダーに含めたものはすべて、プロジェクト内のすべてのヘッダー ファイルで使用できます。これは、プロジェクト全体で頻繁に使用されるヘッダーを含めるのに非常に役立ちます。

Delphi に戻ります。DebugService というユニットがあります。それを使用するには、別のユニットが必要です: DependentUnit1、DependentUnit2。

したがって、DebugService を使用するすべてのユニットで、他のすべての依存ユニット (DependentUnit1、DependentUnit2) を手動で追加する必要があります。

私が望むのは、依存関係として DebugService を指定し、そのすべての依存関係を取得できるようにすることだけですか?

言い換えれば、私が欲しいのは:

uses
  DebugService;

ではない:

uses
  DebugService, DependentUnit1, DependentUnit2;

これはまったく可能ですか?

ありがとうございました!

4

4 に答える 4

12

皮肉なことに、「2013 年に C++ にはまだモジュールがないのはなぜですか」という質問の方が適切な場合に、このように質問します。

通常、Delphi のコンパイル ユニットは、重複した .h ファイルと .cpp ファイルに分割されません。お気づきかもしれませんが、Delphi ユニットにはインターフェイスと実装のセクションがあります。これは、真のモジュール システムになります。コンパイルされた .DCU ファイルは、C++/C コンパイラの「.obj」ファイルとは大きく異なります。これは、"uses UnitX" が検出されたときに、インターフェイス領域だけがコンパイラによって非常に迅速に読み取られるためです。

最近、Apple の CLANG/LLVM コンパイラ開発者は、真のモジュール サポートの基礎を最新の CLANG/LLVM C および Objective-C コンパイラに追加し始めました。つまり、XCode でのプリコンパイル済みヘッダーのサポートは、もはや好ましい方法ではありません。真のモジュールはプリコンパイル済みヘッダーよりも優れているからです。プリコンパイルされたヘッダー システムは、モジュールと呼ばれる本物を手に入れることができない場合に、喜んで手に入れたぼろぼろのクラッジとして、モジュールを 1 つだけ持つようなものであると言えます。あなたは Windows 開発者ですが、CLANG/LLVM について何を気にしますか?と言うかもしれません。世界がゆっくりとプリコンパイルをあきらめ、最終的にはモジュールに移行している証拠です。C++ 標準化委員会は、

要するに、馬のない馬車がキャッシングを加速し、馬の動力装置へのオーツの迅速な展開を可能にする機能を獲得しようとしているかどうか、あなたの質問は尋ねているかもしれないと言うかもしれません.

ここでは必要ありません。実際のモジュールをサポートする実際のコンパイラがあります。話の終わり。モジュール (clang/llvm 内) はプリコンパイル済みヘッダーよりも高速であることに気付くかもしれません。また、クレイジーな問題のほぼ無限の原因であるプリコンパイル済みヘッダーよりも、問題の原因にはなりません。

于 2013-06-24T22:19:02.753 に答える
5

Delphi には、プリコンパイル済みヘッダーに相当するものはありません。uses 宣言をそのセクションの独自の宣言から使用する場合、追加のuses参照を追加する必要があり、その宣言は他のユニットによって使用されるため、それらの他のユニットに依存します。インターフェイスの依存関係を減らすようにユニットを設計でき、代わりに依存ユニットをセクションでのみ使用すると、他のユニットの句にandを含める必要がなくなります。しかし、それが常に可能であるとは限らないことを理解しています。DebugServiceDependantUnit1DependentUnit2interfaceimplementationDependantUnit1DependantUnit2uses

複数のユニット間でコードを共有する必要がある場合は、そのコードを独自のユニット/パッケージに移動することをお勧めします。

于 2013-06-24T22:12:42.820 に答える
1
 #include "baseHeader.h"

と同等です

 {$I baseHeader.pas}

そのファイルには好きなものを入れることができます。インターフェイスセクション全体でさえ。

あなたの問題に対する他の代替手段は、条件定義の使用です。

メインプロジェクトファイルで

{$DEFINE debugMyApp} 

使用する各ユニットで

use 
  abc 
{$IFDEF debugMyApp}
   , additionalUNit1
   , additionalUNit2 
   , etc
{$ENDIF}
   ;
于 2013-06-25T06:40:33.543 に答える