2

私は C の経験豊富なプログラマーではありませんが、仕事でこの言語を使用して、SunOS と Win32 の両方でコンパイルされる静的ライブラリを構築する必要があります。このライブラリには、いくつかのソース ファイルとそれに対応するヘッダー (たとえばa.c、 、b.ca.hおよびb.h) しかありません。プロジェクトは両方のプラットフォームでコンパイルされ、ライブラリmylib.aが生成されます。

私の問題は、実装された関数mylib.aを他のプロジェクトに公開する方法です。両方を追加するa.hb.h、マクロの再定義エラーが発生するためです。

編集:マクロの再定義エラーは、コンパイルコマンドへのマクロ定義(私のヘッダーとは関係ありません)が原因であることがわかり、解決されました:)それでも、ソースファイルとヘッダーファイルの整理についてアドバイスが欲しいです。

私の疑問は、変更a.hb.hて外部で使用するか、またはこのライブラリのインターフェイスを宣言するために特別にヘッダー ファイルを作成する必要があるかどうかです (たとえばmylib.h)。元のヘッダーを過度に複雑にしたくはありませんが、別のヘッダーを同期させておく必要はありません...経験豊富なCプログラマーから、パターン、各アプローチの利点、および他に方法があるかどうかについて聞きたいですオプション。

前もって感謝します。

編集:十分な情報を提供していないようです。以下のスキーマは、ファイルがどのように構成されているかを示しています。各コード ファイルにはヘッダーのみが含まれ、各ヘッダーにはガード条件があり、各ヘッダーには共通ヘッダーが含まれ、この共通ヘッダーにはすべてのヘッダーが含まれます。

// a.c ----
#include "a.h"

// b.c ----
#include "b.h"

// a.h ----
#ifndef GUARD_A_H
#define GUARD_A_H
  # include "liball.h"
  void function_prototypes_implemented_in_a();
#endif // GUARD_A_H

// b.h ----
#ifndef GUARD_B_H
#define GUARD_B_H
  # include "liball.h"
  void function_prototypes_implemented_in_b();
#endif // GUARD_B_H

// liball.h ----
#ifndef GUARD_LIBALL_H
#define GUARD_LIBALL_H
  # include <time.h>   // standard headers
  # include <stdioa.h>

  # include "a.h"      // all headers in this project
  # include "b.h"
#endif // GUARD_LIBALL_H
4

2 に答える 2

5

mylib.hライブラリのユーザーが知る必要がある定義のみを含むパブリック ヘッダーが必要です。

mylib-internal.hこれで、プロジェクト内で使用されるプライベート ヘッダーが作成されます。2つを「同期」させようとするのではなく、をmylib-internal.h含める必要があります#include "mylib.h"

また、すべてのインターフェイス関数にmylib_initialize()etc. などの名前を付け、すべてのプライベートな内部関数が 宣言されているかstatic、または名前が付けられ_mylib_internal_whatever()ていることを確認して、ユーザーが他のライブラリと名前空間の衝突を起こさないようにする必要があります。

于 2012-11-06T11:33:13.373 に答える
0

質問があいまいすぎるので、私の答えは一般的なアドバイスです。二重のインクルードを避け、ヘッダーにインクルード ガードを使用する必要があります。

a.h

#ifndef __HEADER_A_H__
#define __HEADER_A_H__ 
...
#endif

b.h

#ifndef __HEADER_B_H__
#define __HEADER_B_H__ 
...
#endif

編集:私が言ったように、含める必要がない二重(または循環)の包含を避けliball.ha.hください。また、ヘッダーガードは と同じであるため、まったく定義されないことb.hに注意してください。liball.hb.hb.h

于 2012-11-06T11:36:19.530 に答える