0

プロジェクトのドキュメントを読もうとしています。タイトルPrototypeの下に、次のコードがあります。

VisionAPI_RETURN VisionAPI VisionInterf_ImageAttach( 
     VisionAPI_HANDLE ImageHandle , 
     uint32_t NumImages 
);

関数が C++ である場合、プロジェクトのインターフェイスは C でビルドされます。ドキュメンテーションを読むときにプロトタイプを読んだので、「関数プロトタイプ」だと思いました。詳細を読むと、著者が「関数」や「インターフェース」という用語を使用していることがあります。C++ でインターフェイスを作成する方法は知っていますが、C では知りません。

上記のコードはインターフェイスまたは関数プロトタイプに関するものですか?

それ以外の場合、C 言語でインターフェイスを作成するにはどうすればよいですか? 構造体(struct)を作成することによるものですか?

私の質問がばかげていないことを願っています。私は Java 開発者であり、C/C++ の簡単な学生です。

4

3 に答える 3

2

C 言語にはインターフェイスのようなものはありません。プリミティブ型とポインターに加えて、言語はstructs と関数をサポートします。それはあなたが働かなければならないすべてです。

あなたのコードは、関数の前方宣言の例を示しています。C モジュールへのインターフェイスは、複数のそのような宣言と、structこれらの関数が使用する s の宣言で構成されます。

于 2013-09-10T11:23:26.607 に答える
1

(@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 構文の拡張です (多くのコンパイラには、このような拡張機能があります)。

于 2013-09-10T11:34:53.683 に答える