つまり、foo
defined whereという名前の関数があり、その型を知りたいとします。
foo
d ヘッダー ファイルのどこかに実際にプロトタイプがない場合#include
、これは簡単です。
- C99 を使用している場合、コードは無効です。
- それ以外の場合は、
foo
引数を取らずに を返す必要があります。そうしないとint
、コードが無効になります。
そして、これは「技術的に無効ですが、すべてのプラットフォームで機能する」ケースの 1 つではありません。それは壊れます。たとえば、64 ビット x86 Linux または Mac 用の gcc 4.2 では、次のようにします。
double foo(double f) { return f*2; }
次に、ヘッダー ファイルなしで、次のように呼び出します。
double f = foo(2.0);
printf("%f\n", f);
C89 としてコンパイルされている場合、これは問題なくコンパイルおよびリンクされ (clang または gcc 4.8 では警告が表示されますが、gcc 4.2 ではデフォルトでは警告が表示されません)、実行され、出力され2.0
ます。少なくとも x86_64 では。ARM7 では、スタックが破損し、運が良ければ segfault が発生します。(もちろん、実際には 2.0 または初期化されていないランダムな値のいずれかを 2 倍にしますが、それを返すことはできません。呼び出し元がアクセスすることを知らない任意の浮動小数点レジスタに格納されています。)
ヘッダー ファイルにある場合は、いつでも検索できます。emacs、グラフィカル IDE などは、この点で非常に優れています。しかし、コンパイラを使用すると、2 つの方法で問題を解決できます。
まず、これを行うだけです:
gcc -E main.c > main.i
less main.i
を検索すると/foo
、見つかります。
または、perreal の回答のように、コンパイラをだましてエラー メッセージを表示させることもできます。