stack.h と queue.h の 2 つのファイルがあるとします。どちらも関数 add() を実装したいと考えています。たとえば、同じ main.c に stack.h と queue.h を含めると、競合が発生します。
両方のファイルに add() 関数を実装するための推奨される方法は何ですか?
stack.h と queue.h の 2 つのファイルがあるとします。どちらも関数 add() を実装したいと考えています。たとえば、同じ main.c に stack.h と queue.h を含めると、競合が発生します。
両方のファイルに add() 関数を実装するための推奨される方法は何ですか?
これが純粋な C である場合、最も簡単な一般的な解決策は、関数が適用されるモジュールまたはデータ構造の名前に関連する関数で自分で名前空間を使用することです。例えば
stack_add(...)
queue_add(...)
ほとんどすべての大規模な純粋な C プロジェクトで、この例を見つけることができます。
pthread_mutex_lock() // POSIX/UNIX, used for locking a mutex
CGRectMake() // iOS, used to fill in a CGRect structure
RtlZeroMemory() // WinNT, "Rtl" indicates the module it belongs to
すでにキューとスタックの実装がテストされていて、他の場所で参照されている場合は、次のようなプリプロセッサのトリックを実行できます。
#define _STACK
#define _QUEUE
#ifdef _QUEUE
#define add queue_add
#include "queue.h"
#undef add
#endif
#ifdef _STACK
#define add stack_add
#include "stack.h"
#undef add
#endif
int main()
{
stack_add();
queue_add();
}
私のアドバイスは - コードベースをリファクタリングして、add
andなどの一般的な関数名の代わりに衝突しない命名規則を使用することsubtract
です。
オブジェクト指向プログラミング スタイルのファンであり、「追加」、「変更」の概念全体が好きな場合は、キューおよびスタック構造内で関数ポインターを使用します。
#define TYPE int
typedef struct tagStruct{
TYPE *dataBuffer;
void (*add)(TYPE data);
void (*modify)(TYPE data, int index);
void (*deleteEverything)()
}stack;
メソッドでは、名前衝突のないさまざまな関数にとをinit(stack)
割り当てます (キューの場合も同様)。add()
modify()
deleteEverything()
次に、関数の束ではなく、エンティティとして andstack
を見始めます。queue
その後、これを行うことができます:
stack stc;
init(stc); /*sets up the function pointers*/
stc.add(10);
stc.modify(30,0);
stc.deleteEverything();