2

ゆるやかに関連するヘッダーライブラリのセットがあり、緊密に結合せずにそれらを連携させたいと考えています。これを行うことを考えた1つの方法は、他のヘッダーファイルをインクルードすることです。それらが見つかった場合は、それに応じてコードを生成できます。したがって、おそらく私はvector.hhにベクトルクラスを持っているでしょう:

#ifndef __VECTOR_HH__
#define __VECTOR_HH__

bunch of vector-y stuff

#endif

次に、別のファイルでcoordinates.hh(座標変換を行うとしましょう):

#ifndef __COORDINATES_HH__
#define __COORDINATES_HH__
#include <vector.hh>

class SomeCoordinateType {
#ifdef __VECTOR_HH__
    operator vector() { <convert to vector> }
#endif
}

#endif

ユーザーであるという考えは、必要なヘッダーファイルをすべて取得します。それらがvector.hhヘッダーとcoordinates.hhを取得する場合、そうでない場合は、変換演算子を作成します。これはすべて、失敗しても致命的なエラーを生成しない#includeディレクティブを使用できるかどうかにかかっています。これを行う方法はありますか?

4

2 に答える 2

7

これを行う一般的な方法の1つは、選択した構成に必要な他のヘッダーのみを含むカスタム「config.h」(明らかに適切と思われる名前を使用)を生成する小さな構成ツールを使用することです。

もう1つの可能性は、config.hに他のヘッダーを条件付きで含め、それらの包含を制御するマクロを定義する(または定義しない)ことで機能を有効にする適切なmakefileを構成ツールに生成させることです。通常、実際の依存関係を定義するメインのmakefileがあり、次のような行を含めるための小さなファイルを生成するだけです。

機能=-DCOORDS-DVECTOR

CFLAGS = $(FEATURES)-O2

...次に、それをメインのmakefileに含めて、コンパイル中に定義された値を取得します。これにより、それらに依存する機能が有効になります。次に、ヘッダーに次のようなものがあります。

// coordinates.h
#ifdef VECTOR
#include <vector>
#endif

// ...
class coordinate {
   #ifdef VECTOR
       operator vector() { /* ... */ }
   #endif
};

ただし、コードが#ifdefどこにでも詰め込まれないように一生懸命努力します。特に、定義されている機能の特定の組み合わせに対してクラスがどの機能を持っているかを把握するために、時間と注意深い分析が必要になるほどネストされています。

于 2012-05-15T02:58:25.027 に答える
3

C標準によれば、コンパイラーは欠落しているヘッダーの診断を行う必要があります。

それが完了すると、コンパイルを続行し、実行できるオブジェクトファイルを生成できます。一方、ほとんどの場合、ヘッダーが欠落していると、他のエラーの主要なリストが表示されるため(ヘッダーはコンパイルに不可欠であるため)、オブジェクトファイルは生成されません。

コンパイラーは、ヘッダーが欠落しているためにオブジェクトファイルを生成しない権利の範囲内にあるため、失敗以外のことを移植可能に想定することはできません。そして、失敗は断然最も一般的な結果です。

(IIRC、かつて—おそらく10年以上前— Sun Cコンパイラはメッセージを生成しまし#errorたが、コンパイルを続行しましたが、保護対象によっては正常に実行されることもありました#error。それ以降は修正されています。直接同じではありませんが、多少関連しています。 。)

于 2012-05-15T01:12:40.367 に答える