2

そのため、使用するためにインクルードする必要があるヘッダー ファイルを含むサードパーティ ライブラリがあります。ライブラリの実装はオブジェクト指向ではないため、ライブラリのすべての使用法をカプセル化するクラスを作成しました。そのため、置き換えが必要な場合は、そのクラスの実装を変更するだけで済みます。

他の開発者が同じコード ベースで作業するため、ライブラリが含まれている場合にエラーを発生させる方法が必要です。これは、ライブラリへの参照がいたるところにあるのを避けるためです。

たとえば、次のようなことをするとします。

#include "cool_library.h"

次のようなエラーが表示されます。

do not include directly cool_library.h, instead use the cool_library_wrapper class

これは可能ですか?私はGNU GCCを使用しています

4

5 に答える 5

4

を使用しているため、プリプロセッサgccの機能を使用でき#include_nextます。ヘッダー ファイルを探すときに優先度が高くなるディレクトリに、サード パーティと同じ名前のヘッダーを作成します。ヘッダーのバージョンでは、次のようなものを使用します

#if WRAPPER_HEADER_HAS_BEEN_INCLUDED
#  include_next <cool_library.h>
#else
#  error ...
#endif
于 2011-10-13T01:54:02.727 に答える
3

#ifndef ブロック内で #error プリプロセッサ ディレクティブを使用できます。

たとえば、元の .h ファイルには次のように記述されています。

#ifndef COOL_LIBRARY_WRAPPER_CLASS_INCLUDED
#error "do not include this file directly
#endif

そして、ラッパー クラスのヘッダー ファイルで次のようにします。

#define COOL_LIBRARY_WRAPPER_CLASS_INCLUDED
于 2011-10-12T23:08:53.310 に答える
2

cool_library.hこれは、ファイルの変更に問題がない場合にのみ可能です。次のようなことができます:

cool_library.h

#ifndef INCLUDED_FROM_COOL_LIBRARY_WRAPPER
#error do not include directly cool_library.h, instead use the cool_library_wrapper class
#endif

.. remainder of original cool_library.h

cool_library_wrapper.h

#define INCLUDED_FROM_COOL_LIBRARY_WRAPPER
#include "cool_library.h"

... your wrapper

#undef INCLUDED_FROM_COOL_LIBRARY_WRAPPER

もちろん、同僚がINCLUDED_FROM_COOL_LIBRARY_WRAPPER自分自身を定義し、元のヘッダー ファイルをインクルードすることを防ぐことはできません。これは技術的な解決策がない社会問題です。

于 2011-10-12T23:10:34.213 に答える
1

<cool_library.h>通常のビルドインクルードパスを入れないでください。ラッパーにspecialCFLAGSを使用してアクセスを許可するか、<vendor/xyz/cool_library.h>より高レベルのインクルードパスなどのより明示的なパスを使用してアクセスできます。

別のパスベースのアプローチは、ローカル<cool_library.h>をインクルードパスの前に配置し、#ifdef/#error上記のアプローチを使用することです。魔法の定義が存在する場合、スタブヘッダーはより明示的なパスを使用して実際のヘッダーを取得できます。(一部のコンパイラには、読み取られているヘッダーとまったく同じ名前の何かを含めると、検索パスを続行するためのハックがあります)

于 2011-10-12T23:48:32.603 に答える
1

通常、プロジェクト全体のヘッダーをインクルードする場合は、サードパーティのヘッダーからのインクルード ガードの存在を確認できます。

// third_party.h
#ifndef THIRD_PARTY_H
#define THIRD_PARTY_H
...

// your_project_wide.h
...
#ifdef THIRD_PARTY_H
#warning "Please include "cool_library.h"
#endif
...

ここでの警告:#warningは gcc 拡張機能であり、これはすべて、プロジェクト ヘッダーの前に含まれる外部依存関係に依存しています (これは望ましくない場合があります)。

于 2011-10-12T23:10:15.647 に答える