1

これは私の C クラスの課題です。私はすでに C++ の経験があります。私が抱えている問題は、私の実装が単に怪しげに見えることです。私の現在の実装では、一度に 1 つの LinkedList しか使用できません。いつでも構造体へのポインターを渡すことができることはわかっていますが、それは避けたかったのです。したがって、それは本当に日陰になりました。また、関数の範囲を規制する方法もありません。それらはグローバルに表示されます。また、h ファイル内の構造体へのポインターにも注意してください。それが、1 つのプログラムに複数のプログラムを含めることができない理由です。すべての関数へのポインターを渡す以外に、別の方法を考えられる人はいますか?

現在は単独でリンクされているだけですが、二重にリンクされているものは 30 分もかかりません。

LinkedList.h

LinkedList.c

4

2 に答える 2

4

はい、C では、構造体へのポインターを、それを操作するすべての関数に渡します。

typedef struct list list_t;

list_t *list_new();
void list_delete(list_t *list);
void list_insert_back(list_t *list, void *obj);
void list_insert_front(list_t *list, void *obj);
/* etc. */

「範囲を調整する」とはどういう意味かわかりません。関数名について話している場合は、通常、関数名の前にlist_上記のような一般的なプレフィックスを付けます。

舞台裏では、これは最終的に C++ コードと同じように動作します。C++ コンパイラはメンバー関数のプレフィックスを付け (例では を使用してlist_いますが、C++ コンパイラでは異なる方法で行われます)、C++ コンパイラはthisパラメータも暗黙的に渡します。

実際、最も古い C++ コンパイラ (cfront) は、上記のように C++ コードを直接 C コードに変換していました。

典型的な C++ メソッドとは対照的に、ヘッダー ファイルでリンク リスト構造を定義する必要がないことに注意してください。これにより、ABI 互換性を損なうことなくデータ構造を変更できます。

于 2012-10-29T01:49:27.180 に答える
3

あなたの質問の残りの部分は回答されているので、関数の範囲を制限できることを追加したいと思います:単に宣言するだけでstatic、内部リンケージが得られます:

/* This function won't be seen outside of the header file */
static void foo(list *l); 

fooこれは基本的に、クラスでプライベート関数を宣言することと同じです:

class list
{
private:
    void foo();    
};
于 2012-10-29T02:46:10.173 に答える