-2

私は3つのファイルを持っています。

trees.h
// a bunch of typedefs and function prototypes
#include <trees.c>

trees.c
// a bunch of function bodies

main.c
#include <trees.h>

trees.c のすべての関数で、trees.h で定義された型に関する「未定義の型」エラーが発生するため、これは正しくありません。考えられるすべての構成を試しました-メインからtrees.cを含め、trees.cからtrees.hを含め、trees.hの最後にtrees.cを含め、trees.hの先頭に含めます.. . 私が考えることができるインクルードのすべての組み合わせで、それぞれが異なるエラーのセットを返します。複数の定義の場合もあれば、未定義の関数の場合もあります...

では、これはどのように機能するのでしょうか。どのファイルに何を入れ、どのファイルをどこに含めるか?

4

5 に答える 5

1

これが機能しない理由は、「extern」を使用して、標準のものとは異なるインクルードファイルで宣言されている変数または関数を定義する必要があるためです。また、すべてのヘッダーファイルを*.hとして保存する必要があります。したがって、tree.hで構造体'tree'を定義したと仮定します。

#include <tree.h>

int main() {
    extern tree; /* Get variable 'tree' declared in tree.h */
    extern make_tree(void); /* Get function make_tree() declared in tree.h */

    make_tree(); /* Call function */
    return (0); /* End */
}
于 2013-02-13T14:51:08.463 に答える
1

このような:

trees.h
// a bunch of typedefs and function declarations (prototypes)

trees.c
#include <trees.h>
// a bunch of function definitions (bodies)

main.c
#include <trees.h>

説明:

#include基本的に、インクルード ファイル全体をこのファイルにコピーするのと同じです (ここに#include.

trees.hそのため、 inを含めるとmain.c、そのファイルは の関数について知ることができますtrees.c

trees.hinを含めると、trees.c下位の関数trees.cを使用できるようになります。これは、in で使用される define などtrees.cを指定する場所でもあります。

また、複数のオブジェクトの作成とそれらのリンクについても知らない場合があります。Joachim Pileborg の回答を参照してください。

(非常に醜い)代替手段は次のとおりです。

trees.h
// a bunch of typedefs and function declarations (prototypes)

trees.c
#include <trees.h>
// a bunch of function definitions (bodies)

main.c
#include <trees.c>

次に、コンパイルするだけですmain。しかし、少数の.cファイルのプロジェクトでは、これは非現実的になります。

于 2013-02-13T11:05:31.790 に答える
1

各ソース ファイルをオブジェクト ファイルにコンパイルし、これらのオブジェクト ファイルをリンクして最終的な実行可能ファイルを作成します。たとえば GCC を使用してコマンド ラインでコンパイルする場合、両方のソース ファイルをコマンド ラインに入力すると、GCC が処理します。

$ gcc main.c tree.c -o tree

上記のコマンドは、ファイルandgccをコンパイルしてリンクし、出力に executable という名前を付けるように指示します。ソース ファイルを個別にオブジェクト ファイルにコンパイルし、それらを手動でリンクすることもできます。main.ctree.ctree

$ gcc -c main.c -o main.o
$ gcc -c tree.c -o tree.o
$ gcc main.o tree.o -o tree

上記のコマンドでは、-cオプションはgccオブジェクト ファイルの作成を指示し、オプションはそのオブジェクト ファイルの名前を-o指示します。gcc最後のコマンドは、これらのオブジェクト ファイルを取得し、最終的な実行可能ファイルを作成し、(-oオプションを使用して)という名前を付けますtree

ソース ファイルには、必要なヘッダーを含めますが、その逆ではありません。

于 2013-02-13T11:05:40.140 に答える
0

.c実装 ( ) ファイルを含めないことから始めます。ヘッダー ( .h) ファイルのみを含めます。それらで宣言された型または関数が必要な場合はいつでもそれらを含めます。複数の宣言を避けるには、インクルード ガードを使用します (それらが何であれ、Google で調べてください)。

于 2013-02-13T11:06:52.397 に答える