1

私は単に C で独自のヘッダー ファイルを実装しようとしています。最初に、ファイル INC2.h があります。

void diffadd(int b[], int n);
int diffcheck(int m);

次に、ファイル INC2.cpp を作成します。

void diffadd(int b[], int n)
     {
     int i=0;
     for (i=0; i < n; i++)
          {
          b[i]=b[i]+1;
          printf("\n%d",b[i])
           }
      }
 int diffcheck(int m)
     {
      return (m*5);
      }

次に、メインファイル LETS.cpp で

  #include"inc2.h" 
  void main()
      {
       clrscr();
       int a[5]={1,2,3,4,5};
       diffadd(a,5);
       int t=diffcheck(5);
       printf("t=%d",t);
       getch();
       }

次に、inc2.cpp をコンパイルします。大丈夫!

次に、lets.cpp をコンパイルします。

次のエラーが表示されます。

モジュール LETS.cpp 内の未定義のシンボル diffcheck(int)

モジュール LETS.cpp 内の未定義のシンボル diffadd(int near*, int)

興味深いことに、INC2.cpp を LETS.cpp に含めると、IT は機能します。

別のヘッダー ファイル HEAD.h を作成し、ここですべての関数を定義すると、うまくいきます。

ここで何が起こっているのか説明してください!

4

2 に答える 2

3

プログラムのリンクについては、インターネットでいくつかのチュートリアルを調べてください。

単一の.c/.cppファイルをコンパイルすると、多くの場合、コンパイラがリンク作業を行い、その出力に完全な実行可能ファイルが作成されます。しかし、複数のソース ファイルがある場合、事態は複雑になります。各ソース ファイル (ヘッダーではありません!) は、シンボルのリスト(関数/変数名/メモリ内のアドレス) を含む.h中間ファイルオブジェクト ファイルにコンパイルされます。 - メモリに常駐し、外部ファイルから見えるすべてのもの) と、ファイルが必要とするシンボルの別のリスト。この段階はそれ自体と呼ばれます。次に、特別なプログラムlinkerと組み合わせて、必要な実行可能ファイルにすることができる一連のオブジェクトファイルがあります-これは呼び出されますcompilationlinkingプログラム。リンカーは、すべてのファイルの必須/提供されたシンボルのリストを取得し、すべての必要なシンボルがすべてのオブジェクト ファイルの提供されたシンボルの指定されたセットで見つかるかどうかを調べ、提供された関数を必要な場所にリンクします。

ヘッダー ファイルは、文字通りソース ファイル (.c/.cpp) に含まれる単なるテキスト スタブであり、コンパイルの対象ではありません (いくつかの例外があります)。

したがってinc2.cpp、オブジェクトファイルにコンパイルlets.cppし、別のオブジェクトファイルにコンパイルしてから、リンカーにそれらを実行可能ファイルに結合させます。

于 2012-10-08T06:05:01.963 に答える
0

初めて独自のヘッダー ファイルを定義したときにも、同じエラーが発生しました。次に、関数の定義を含むヘッダー ファイルを定義すると、うまくいきました。

あなたがする必要があるのはそれだけです。のようなヘッダーファイルを定義します

//inc2.h
void diffadd(int b[], int n)
 {
 int i=0;
 for (i=0; i < n; i++)
      {
      b[i]=b[i]+1;
      printf("\n%d",b[i])
       }
  }

int diffcheck(int m) { return (m*5); }

その後、メインファイルの関数を次のように呼び出します

//Lets.cpp
#include"inc2.h" 
void main()
  {
   clrscr();
   int a[5]={1,2,3,4,5};
   diffadd(a,5);
   int t=diffcheck(5);
   printf("t=%d",t);
   getch();
   }

あなたにも役立つかもしれません。

#include"inc2.pp" という名前のヘッダー ファイルを作成することもできます。これも機能します。

于 2012-10-08T06:37:48.307 に答える