2

私は少しCで手を試しています。そして私はこのリンクビジネスを理解したと思いました。しかし、私はそうは思わない。私は単純なファイルmain.cを持っています:

#include "function.h"
int main(char args[])
{
    int print = myfunction();
}

次に、ファイルの2番目のペアfunction.c / function.h

int myfunction(); //function.h

int myfunction()  //function.c
{
    return 5;
}

これをコンパイルするとうまくいきます。ただし、#include "function.h"メインファイルで使用するかどうかに関係なく、うまく機能します。では、なぜfunction.hを含める必要があるのでしょうか。

4

5 に答える 5

3

どのシステムを使用しているかはわかりませんが、gcc または互換性のあるものを使用している場合は、もう一度試してください

cc -Wall -Werror *.c

または、システムの同等のオプションをオンにします。

大きなプログラムは常にこの方法で構築されるため、コンパイラは引数の型をチェックします。動的言語やスクリプト言語とは異なり、C は実際のマシン コードを生成し、実行時にパラメーター数や互換性をチェックしません。

そのため、コンパイル時に型チェックを行うために、関数プロトタイプが基本言語に追加されました。それらはオプションです。

于 2010-11-01T17:09:46.313 に答える
2

AC コンパイラでは、関数1を使用する前にプロトタイプを指定する必要はありません。プロトタイプは、渡されたパラメーターの型が関数が必要とする型に適合することをコンパイラーに検証させるだけであり、正しくない場合は暗黙的に正しい型に変換し、暗黙的な変換が行われます。関連するタイプから/へ。

コードが完璧で、関数の使用方法とその関数の意図された使用方法との間に不一致がない限り、問題はありません。テストでは、パラメーターをとらずに int を返す関数があり、それを使用するコードは本質的に他に何もしません。それは台無しにするのがかなり難しい状況であり、それはうまく機能します. 複雑な型などの複数のパラメータを取る数百または数千の関数を含む実際のプログラムでは、状況はすぐに変わります。関数を正しく呼び出していることをコンパイラに保証させることが、より重要になります。

1可変引数関数を除いて、「可変」パラメーターは基本的に、関数のプロトタイプがない場合と同じ規則に従います。

于 2010-11-01T17:13:26.553 に答える
1

定義されていない関数を使用すると、多くの C コンパイラは、それが int を返す extern 関数であると想定します (警告が表示されることがよくありますが、コードはコンパイルされます)。関数の使用を開始すると、問題が発生します。ただし、より複雑な引数と戻り値の型を使用します。

于 2010-11-01T17:14:45.773 に答える
0

さまざまなモジュールで使用するには、ヘッダーファイル内で関数を宣言します。ソースコードは必ずしも必要ではありません。バイナリ ライブラリにリンクできます。コンパイル時に、引数や型などをチェックするためのメソッドの宣言が必要です。

あなたの簡単な例では、これは必要ありません。

于 2010-11-01T17:08:58.363 に答える
0

宣言されていない関数を使用すると、古い C コンパイラは、関数に引数...と戻り値があると想定しますint。これはお勧めできません。コンパイラの警告を表示すると、宣言されていない関数の使用に関する警告が表示される可能性があります。コンパイラは、main.c をコンパイルする前に function.h を確認すると、より多くの間違いを検出できるため、どのようmyfunctionに動作するかを正確に認識できます。

于 2010-11-01T17:09:59.953 に答える