1

ヘッダーファイルで宣言され、一致するソースファイルで定義された関数を使用するには、main()の前にヘッダーファイルをインクルードする必要があることを理解していました。では、なぜ次のコンパイルと実行がうまく機能するのでしょうか。

gcc -o hello hellomain.c hello.c

hellomain.c

int main(int argc, char *argv[])
{
    helloPrint();

    return 0;
}

hello.h

#ifndef hello_h
#define hello_h

void helloPrint();

#endif

こんにちはC

#include <stdio.h>

void helloPrint()
{
    printf("Hello, World!");
}

これは明らかに非常に単純化された例ですが、私の質問を示しています。「hellomain.c」に「hello.h」を含める必要がないのはなぜですか?ありがとう!

4

2 に答える 2

4

プロトタイプなしで関数を使用する場合、コンパイラーはその戻り型と取るパラメーターについて特定の仮定を行います。この場合、関数が。を返すと仮定していても、これらの仮定はたまたま機能しますint


Eric Postpischilがコメントで指摘しているように、プロトタイプを省略すると、微妙なバグが発生する可能性があるため、お勧めできません。できれば対応するヘッダーを含めることにより、関数呼び出しに必要なプロトタイプが利用可能であることを常に確認する必要があります。

于 2013-01-21T20:30:50.337 に答える
3

Cソースファイルで宣言されていない関数を使用すると、コンパイラは呼び出しからパラメータを取得し、intの戻り型を想定します。

ISO規格による「プログラミング言語-C」

6.5.2.2関数呼び出し
6呼び出された関数を示す式がプロトタイプを含まないタイプである場合、
...
引数の数がパラメーターの数と等しくない場合、動作は定義されていません。

つまり、関数を宣言せずに使用し、引数の数と関数の実際のパラメーターの数が一致しない場合、すべての賭けは無効になります。

...
関数がプロトタイプを含まない型で定義されており、昇格後の引数の型が昇格後のパラメーターの型と互換性がない場合、動作は未定義です...

また、関数を宣言せずに使用し、引数の型と関数の実際の型が一致しない場合は、何かが発生する可能性があります。

したがって、場合によっては機能する可能性がありますが、プログラムで使用する関数を宣言する必要があります。そうしないと、コンパイラーは関数宣言と関数呼び出しの間の不一致を支援および検出できません。

于 2013-01-21T20:32:15.627 に答える