2

私は組み込みプロジェクトに取り組んでおり、プロジェクトのソース コード (C 言語) には、イーサネットの種類がポーリングか割り込みかを確認するために使用される関数が含まれています。以下のような機能があります

    unsigned char mode(void);

    unsigned char xmode(void)
    {
         if(mode())
            return 1;
      return 0;
    }

関数 mode() には本体がありません。関数 mode() が関数 xmode() によって呼び出されるとどうなりますか?

4

3 に答える 3

3

以前の回答を拡張するには。

これは「空の」関数ではなく、プロトタイプです。

コンパイラはこれを使用して、本体を持つ関数のオブジェクト コードを出力します。関数呼び出しを適切に設定し、変換などを処理できるようにする必要があります。オブジェクト コードには関数への参照が含まれ、リンカーはこれらの参照を正しい値に置き換えます。

また、コンパイラがエラー チェックを行い、リンカよりも多くの情報を取得できることも意味します。興味深いことに、C 標準では、関数の暗黙的な宣言が許可されていました。

(わかりやすくするために簡略化しています。)

于 2012-09-24T06:55:06.813 に答える
3

上記のコードunsigned char mode(void);では、関数mode()が存在し、引数を取らずにunsigned char.

これは実際には関数を定義していません。それを呼び出す方法を定義するだけです。このことは と呼ばれfunction prototypeます。

関数mode()は、後でこの同じファイルまたは別のファイル (おそらくアセンブリ ファイル) で定義されます。

関数プロトタイプの一般的な用途の 1 つは、再帰の実装です。

関数a()とを考えてみましょうb()。それぞれが他の関数を呼び出し、同じファイルで定義されています。

void a()
{
  b();
}

void b()
{
  a();
}

コンパイラがb()の内部を見るときa()、それが実際に何であるか、またはあるべきものについて少しも考えていませんb()。明らかに、 と を定義する順序を変更するa()b()、同じ問題が発生しますが、 のa()内部では認識されなくなりますb()

これを修正するには、プロトタイプを追加します。

void b();

void a()
{
  b();
}

void b()
{
  a();
}

これで、コンパイラは (関数) とは何かをb()認識し、それを呼び出して使用する方法を認識します。

于 2012-09-24T06:49:16.207 に答える
2

これはリンクに失敗するか、実際のmode()関数を含むリンクしているファイルがあります。

于 2012-09-24T05:40:44.057 に答える