(@bitmask と @dasblinkenlight によって提供された既に有用な情報に追加)
C では、関数プロトタイプは、おおよそ、関数シグネチャの宣言です。つまり、関数名、戻り値の型、およびパラメーター リストの型(つまり、関数が受け入れるパラメーターの型をそれぞれの順序で) を宣言したものです。
したがって、ある意味では、関数のプロトタイプは、クライアント コードに対する関数のインターフェイスと見なすことができます (この場合、インターフェイスという用語は、特に OOP や Java での意味とは異なり、一般的な方法で使用されます)。
より簡単な例として、次のような関数を定義したとします。
int MyFunc( double x, char * z )
{
// function body code
}
そのプロトタイプは次のようになります。
int MyFunc( double x, char * z );
あるいは
int MyFunc( double, char * );
関数プロトタイプではパラメーター名はオプションであるためです。
C には、Java インターフェイスと同等のレプリカを作成するメカニズムはありませんが、プログラマーは特別に細工された C ヘッダー ファイルを「インターフェイス」と呼ぶことがよくあります。これらのヘッダー ファイルには、クライアント コードに属するライブラリの "インターフェイス" を表す関数プロトタイプやその他の宣言が含まれています。
したがって、クライアント コードは#include
、その実装 (ここでは "インターフェイス" のこと) を知らなくても、ライブラリによって提供される機能にアクセスするために、これらのヘッダー ファイルを使用できます。これは通常、リンク時 (動的リンクが含まれている場合は実行時) に解決されます。
編集(コメントに回答するため)
関数名の前に表示されているのは、おそらく何らかのマクロ トリックです。文脈が分からないので推測でしかありません。2 つの識別子VisionAPI_RETURN
VisionAPI
は、おそらくマクロとして定義されています。それらの名前から、最初のものは実際の戻り値の型に展開されると思いますが、2番目のものは空のマクロ (通常、宣言のカテゴリをマークするために使用される) またはコンパイラ固有のキーワードの組み合わせに展開され、通常は関数を宣言するために使用されます。低レベルの呼び出し規約。
たとえば、次のマクロ定義がどこかにある可能性があります。
#define VisionAPI_RETURN int
#define VisionAPI
そのため、プリプロセッサが作業を終了した後、コンパイラはこれを確認します。
int VisionInterf_ImageAttach(
VisionAPI_HANDLE ImageHandle,
uint32_t NumImages
);
別の例 - これらのマクロが次のように定義されている場合:
#define VisionAPI_RETURN struct MyReturn
#define VisionAPI __stdcall
プロトタイプは次のように展開されます。
struct MyReturn __stdcall VisionInterf_ImageAttach(
VisionAPI_HANDLE ImageHandle,
uint32_t NumImages
);
この場合、戻り値の型は になりますがstruct MyReturn
、__stdcall
キーワードは"stdcall" 呼び出し規約を示します(__stdcall
キーワードは Microsoft コンパイラで使用されます)。この結果の構文は、標準 C 構文の拡張です (多くのコンパイラには、このような拡張機能があります)。