4

次のパターンはCコードで一般的です。

#ifndef SOMETHING
#define SOMETHING
#endif

このパターンはDelphiコードでも可能です。

{$IFNDEF SOMETHING}
{$DEFINE SOMETHING}
{$ENDIF}

しかし、それは一般的ではありません-私はそれをまったく見たことがありません。IFNDEFDelphiコードが条件付き定義を必要とする場合、チェックなしで定義するだけです。

なぜそうなのか?CとDelphiの条件付きコンパイルの違いは何ですかifndef。前者にはチェックが必要で、後者にはチェックが必要ありません。

4

2 に答える 2

12

これは、これが一般的であるだけでなく、Cでは必須であるためです。

#include <something.h>

これはDelphiではめったに使用されませんが。そして、使用されるとき、それは実際にそれらを設定するために使用されます{$DEFINE}

{$INCLUDE 'something.inc'}

DEFINESは、1つのオブジェクト(.PASファイルまたはファイルの場合があり.Cます)のコンパイル中にのみ有効であるため、これは重要です。Delphiはこのuses句を使用して他のユニットを含め、Cはを使用してそのincludeヘッダーを含めます。ヘッダーには、それC自体が他のヘッダーを含む場合があります。質問しているパターンは、同じヘッダーが再帰的に再含まれるのを防ぐために使用されます。

マテリアルを明確にするために、Cで使用できるものとDelphiで使用できるもののサンプルを次に示します。3つのファイルを設定したとします。ここでは、とのA両方を含める必要がBありCBを含めるだけで済みますC。「C」ファイルは次のようになります。

// ----------------------- A.h
#ifndef A
#define A

#include "B.h"
#include "C.h"

// Stuff that goes in A

#endif

// ------------------------ B.h
#ifndef B
#define B

#include "C.h"

// Stuff that goes in B

#endif

// ----------------------- C.h
#ifndef C
#define C

// Stuff that goes in C

#endif

の条件付き定義がないC.hと、C.hファイルはに2回含まれることになりますA.h。Delphiでのコードは次のようになります。

// --------------------- A.pas
unit A;

interface

uses B, C;

implementation

end.

// --------------------- B.pas
unit B

interface

uses C;

implementation

end.

// --------------------- C.pas

unit C

interface

implementation

end.

{$INCLUDE}Delphi / Pascalバージョンは、この目標を達成するためにを使用しないため、「C」が「A」に2回含まれるのを防ぐ必要はありませんuses。ステートメントを使用します。コンパイラは、B.dcuファイルとファイルからエクスポートされたシンボルを取得しますが、 2回C.dcuのシンボルを含めるリスクはありません。C.dcu


Cコードでより多くのプリコンパイラ指令が表示されるその他の理由:

  • プリコンパイラは、Delphiよりもはるかに強力です。DelphiコードのA{$DEFINE}は条件付きコンパイルのみを処理しますが、Cバリアントは条件付きコンパイルと単語置換の形式の両方に使用できます。
  • forヘッダーの必須の使用は#include、マクロを定義するヘッダーを持つことができることを意味します。#defineまたは、実際の前にいくつかのステートメントを指定して構成されたヘッダーを持つことができます#include <header.h>
于 2012-01-20T06:50:08.870 に答える
3

このパターンは、「Cで一般的な」コード(.cまたは.cppソースファイル)ではありません。これは、C / C ++ヘッダー(.h)ファイルで一般的です。

#ifndef SOMETHING
#define SOMETHING
#endif

その理由は、同じ翻訳単位に同じヘッダーが誤って複数回含まれるのを防ぐためです。

たとえば、モジュール「ac」がヘッダー「bh」を使用するとします。そして「bh」#includeの「ch」。つまり、「ac」は明示的に「b」を使用し、暗黙的に「c」も使用します。ここまでは順調ですね。

ここで、「ch」が「bh」を使用するとします。「#ifndef /#define /#endif」は、「b」が2回目に#includeされるのを防ぎます(「a」で「a」に1回、「a」で「c」に2回目)。

Delphiではこれはすべて不要です。Delphiの「$ifdef」は条件付きコンパイルにのみ使用されます。Delphiの「ユニット」は、潜在的に再帰的および/または循環依存関係を処理します。

于 2012-01-20T06:59:46.837 に答える