libuvの使い方を学ぼうとしています。Mac OS Xを使用していて、ライブラリをダウンロードしてインストールしています。小さなテストプログラムをコンパイルして実行できます。1つはコールバックループを開始し、ウォッチャーがないため終了します。もう1つはアイドル状態のウォッチャーを作成し、時間がなくなると終了します。
私はファイルioのサンプルを調べようとしていて、問題が発生しています。ファイル記述子を取得する関数の関数プロトタイプは次のとおりです。
int uv_fs_open(uv_loop_t* loop,
uv_fs_t* req, // second argument
const char* path,
int flags,
int mode,
uv_fs_cb cb)
サンプルコードを最小値にカットしましたが、それでもエラーが発生します。
#include <stdio.h>
#include <uv.h>
uv_fs_t open_req;
void on_open(uv_fs_t);
void on_read(uv_fs_t);
void on_write(uv_fs_t);
int main(int argc, char **argv) {
uv_fs_open(uv_default_loop(), &open_req, argv[1], O_RDONLY, 0, on_open);
uv_run(uv_default_loop(), UV_RUN_DEFAULT);
return 0;
}
void on_open(uv_fs_t *req) {
if (req->result != -1) {
fprintf(stderr, "function called \n");
}
else {
fprintf(stderr, "error opening file: %d\n", req->errorno);
}
uv_fs_req_cleanup(req);
}
私のopen_reqの宣言は、完全なコードサンプルに表示され、エラーが発生しないclose_reqの宣言とまったく同じです。コンパイラが「このスコープで「open_req」が宣言されていません」というエラーを表示したため、open_reqの宣言を追加しました。宣言を追加すると、エラーが「'void(*)(uv_fs_t)'から'void(*)(uv_fs_t *)'への無効な変換」に変更されました。宣言がmain内にあるかどうかではなく、同じエラーが発生します。宣言をポインタ宣言に変更した場合
uv_fs_t* open_req;
次に、エラーが発生します。
cannot convert uv_fs_t** to uv_fs_t* for argument ‘2’ to
int uv_fs_open(uv_loop_t*, uv_fs_t*, const char*, int, int, void (*)(uv_fs_t*))
私は実際のlibuvコードを調べて理解できるかどうかを確認しようとしていますが、コードは巨大です。http: //nikhilm.github.com/uvbook/にある「AnIntroductiontolibuv」を使用しています。これがサンプルコードの出所です。
このライブラリを試して理解するために使用できるサンプルコードの他のソースはありますか?私が宣言で間違っていることは明らかですか?libuvの使用方法に関する説明や例をどこで探すべきかわかりません。
更新の編集libuvコードのuv.hファイル。私は見つけます
typedef struct uv_fs_s uv_fs_t;
私がコードで探していたものの1つは、この構造体が実際に定義されている場所です。私はgoogleを使用してtypedefを検索し、typedefを使用して名前を作成する方法について少し学びました。これにより、構造体のインスタンスを宣言するたびにstructと入力する必要がなくなります。ひどい習慣だと思う人もいれば、素晴らしいと思う人もいます。close_reqと呼ばれるタイプus_fs_tの別の宣言として、最小サンプルを取得するために削除したものの一部。宣言のフォーマットをそのフォーマットから直接コピーしました。
関数へのポインタについて何がわかるかを見ていきます。私はそれらに漠然と精通しているだけで、少なくともどこかで探し始めることができます。
uv_fs_openの関数定義を見つけました。
int uv_fs_open(uv_loop_t* loop,
uv_fs_t* req,
const char* path,
int flags,
int mode,
uv_fs_cb cb) {
INIT(OPEN);
PATH;
req->flags = flags;
req->mode = mode;
POST;
}