0

コードの一部が別のアプリケーションによって生成される C プロジェクトに取り組んでいます。個別のファイルには、次のものが含まれます。

  • 型定義、main()、およびその他の関数
  • 変数宣言 (型定義は上記のファイルにあります) とそれらの変数を操作する関数

前述のように、2 番目のファイルの情報は別のプログラムによって生成されますが、メイン ファイルの型宣言が使用されます。同様に、メイン プログラムは、2 番目のファイルで定義された変数と関数を使用します。

「include」ステートメントと「extern」ステートメントを使用してみましたが、うまくいきませんでした。2 つのファイルは相互に情報を取得しているため、次のように 3 つのファイルに分割した方が便利でしょうか?

1) 型定義

2) 変数宣言 (ファイル 1 で定義された型を使用) および関連する関数

3) 上記の 2 つのファイルを使用する Main() および残りの関数

これが進むべき道である場合、どのように機能しますか?include または extern を使用しますか? また、これらの句をどのように使用する必要がありますか?

あなたが提供できるどんな助けも大歓迎です。ありがとうございました!

4

3 に答える 3

1

ご提案いただいたレイアウトで問題ありません。おそらく、extern#includeが何をするかについての説明が役立つでしょう。1) #includeはプリプロセッサ ディレクティブであり、基本的に次のように述べています。

2) externは C の予約語です。あまり専門的なことには触れませんが、その意味は次のとおりです。「このステートメントで指定された変数は、別の場所で定義されています」。変数のスペースはコンパイラによって一度だけ予約されるため、関数が問題の変数にアクセスする必要がある場合、コンパイラが定義を確認する前にいくつかの情報が必要になります。extern宣言には、関数が変数を使用するのに十分な情報が含まれており、リンカーは後の段階で正しい変数が使用されることを確認します。

したがって、シナリオでは、型定義を含むファイルは、それらの型を参照するすべてのファイルで#includeされます。プロジェクトの他の部分とは別にコンパイルされる 1 つのファイルにすべての変数定義を収集する場合、それらの変数を使用し、個別にコンパイルされるファイルには、他の場所で定義された各変数のextern宣言を提供する必要があります。変数定義を含む th ファイルを単純にインクルードすると、コンパイラは定義を 2 回 (最初に定義を含むファイルで、次にそれを含むファイルで) 参照し、各変数を 2 回定義しようとしていると想定し、エラー。

最後に、簡単なシナリオを次に示します (実際には意味がなく、スタイルも良くありません)。

交流 - - - - -

#include "t.h"

mytype a;
mytype b;

int f( int x, int y ) {

    return (x + y)*a - b;

}

mc---------

#include <stdio.h> // for stdout
#include "t.h"
#include "v.h"

int main () {

    fprintf( stdout, "%d", a + b - f(1, 2) );

    return 0;

}

目 -----------

typedef int mytype;

-----------

#include "t.h"

extern mytype a, b;

int f( int, int );

vh と th を組み合わせることができます (スタイルとプロジェクトの要件の問題です)。vh 内の f の宣言には、その前に暗黙の extern があることに注意してください。

于 2013-08-02T22:42:15.667 に答える
0

最終的に修正されました。他の誰かが同じ問題を抱えている場合、私は Alexsh の手順に従いましたが、再定義を防ぐために .h ファイルにガードを含める必要もありました(そうしないと、コンパイルされません)。Alexsh と Jonathan の協力に感謝します。

于 2013-08-04T06:58:55.167 に答える