例を使用して私の提案を拡大してください。
あなたのライブラリには、少なくとも2つの(少なくとも)ヘッダファイルが必要です。ライブラリのユーザには1つの公開があり、ライブラリのソースファイルには1つしか含まれません。
国民が
#pragma once
// This is all that is needed to declare pointers to the internal structure
typedef struct internal_structure STRUCTURE;
// The public API of your library
STRUCTURE *lib_init(void);
void lib_cleanup(STRUCTURE *s);
...
のようなものかもしれないそうすれば、プライベートヘッダファイルに
#pragma once
struct internal_structure
{
int fd;
// Other members as needed
...
};
// Possible function prototypes of private functions
を持っその後、あなたのライブラリーのソースファイルに、あなたは、パブリックおよびプライベートヘッダファイル、および使用の両方が含まれますブラックボックス構造のSTRUCTURE
:
#include <stdlib.h>
#include "public.h"
#include "private.h"
STRUCTURE *lib_init(void)
{
STRUCTURE *s = malloc(sizeof *s);
s->fd = open(...);
// Other initialization
...
return s;
}
void lib_cleanup(STRUCTURE *s)
{
// Other cleanup
...
close(s->fd);
free(s);
}
は、その後、あなたのライブラリーのユーザーのみ公共のヘッダファイルが含まれており、あなたの明確に定義されたAPIを使用しています。
#include "public.h"
int main(void)
{
STRUCTURE *s = lib_init();
...
lib_cleanup(s);
return 0;
}
公共の機能は、すべてのと同様に、その引数の一つ、典型的には、その最初の引数としてSTRUCTURE *
を取る必要がありますlib_cleanup
機能。この関数は、構造体とそのメンバを任意の方法で使用できます。
一般的なアドバイスとして、決して静的なグローバル変数を使うべきではありません。代わりに、必要なすべての変数をメンバーとして含む「ブラックボックス」構造を作成し、初期化関数からのポインタを返すことをお勧めします。 C標準のI/O関数とよく似ています。 'fopen'は未定義の' FILE'構造体へのポインタを返します。 –
どのようにして、必要なすべての内部変数をC言語のメンバーとして定義できますか?私には翻訳単位全体が利用可能であるが、翻訳されることはできないということです。それはかなり静的なグローバル変数ですよね? – justynnuff
これは「ブラックボックス」構造に関する素晴らしいことです。あなたのAPIのユーザーが気付かれることなく、必要に応じて新しいメンバーを追加したり、古いものを削除したり、既存のものを変更したりすることができます。 –