13

この再帰関数を正しくコンパイルできないようですが、その理由がわかりません。コードは次のとおりです。

void point_forward (mem_ptr m) {
  mem_ptr temp;
  temp = m->next;
  if (temp->next != NULL) point_forward(temp);
  m->next = temp->next;
}

私のコンパイラはこれを返します:

mm.c:134:6: 警告: 'point_forward' のタイプが競合しています [デフォルトで有効]
mm.c:96:2: 注: 'point_forward' の以前の暗黙の宣言がここにありました

4

1 に答える 1

17

鍵はこれにあります:

「point_forward」の以前の暗黙の宣言はここにありました

96 行目には、次のものがあります。

point_forward(m); // where m is a mem_ptr;

コンパイラは の関数宣言をまだ見ていないためpoint_forward(m)、int を返す関数を「暗黙的に定義」(つまり、想定) します。

int point_forward(mem_ptr m);

これは後の定義と矛盾します。

void point_forward (mem_ptr m) {

これを修正するには、次のいずれかを実行できます。

  1. 96 行目の前のどこかに明示的な宣言を置きます。これにより、関数の実装をまだ見ていない場合でも、96 行目にある場合void point_forward(mem_ptr m);の処理​​方法がコンパイラに伝えられます。point_forward()

  2. または、関数全体を 96 行より上で定義します (関数定義を 134 行から 96 行の上に移動します)。

関数の宣言についてもう少し説明します。

一般的に、スタイルについては、次のいずれかを行います。

  • point_forward()他の C ファイルで使用したくない場合は、完全に定義します。

    static void point_forward(mem_ptr m) { ..function body goes here.. }

    ソースファイルの先頭。

  • 他の C ファイルで使用する場合point_forward()は、前方宣言を行います。

    void point_forward(mem_ptr m);
    

    他のファイルをインクルードするためのヘッダー ファイル。

于 2013-04-24T02:05:30.033 に答える