2012-05-12 9 views
0

Apache Webサーバー用のモジュールを構築する際に、とapr_array_header_tという宣言のように、構造体の宣言ではconst char*というメンバーが必要であると言われていますが、mod_security、新しいap_parse_form_data関数でさえ、void *データ型がこれらの構造体に挿入されていることを示しています。私はset C構造体のオーバーライドがどのように可能であるかを理解したいと思いますか?

私は同じ方法を使用しようとすると、これはどうやって可能ですか、なぜ私のVisual Studioコンパイラは文句を言いますか?

この例の良い例は、void *request_recというメモに保存するcreate_request関数を使用したmod_securityです。

答えて

1

ポインタは転換であり、すべてのオブジェクト・ポインタ・タイプはvoid*内の任意のポインタを格納する情報を失わないという意味で、void*に変換可能です。

struct Foo a; 
struct Foo * p = &a; // p points to a 

void * q = p;   // OK, can store the value of p in q 

struct Foo * r = q; // OK too - we can go back, and r points to a 

r->n = 1; 

したがって、それはそれらが常にどの他のオブジェクトポインタの値を保持し、かつ唯一の背中にそれをキャストすることができますことを知って、void*としてポインタを周りに渡すためにCで通例である:それは、次のが有効である、と言うことです必要なときに希望するタイプ。

つ最終ワード特に約charポインタ:char*任意オブジェクトポインタをキャストし、実際に文字の配列へのポインタとして、それをデリファレンスがタイプpunningを構成しないと厳格なエイリアシング規則の違反はないんこれは、単にオブジェクトの基礎となるバイナリ表現にアクセスすることを可能にします。

+0

それは私のコンパイラですか?同じ正確なコードを使用してプロセスを見つけようとしたとき、コンパイラは私が使用していた関数の定義が受け入れられたapr_table_t *、const char *、const char *だけであることを激しく批判しました。私はWindows上でコードをコンパイルしようとはしませんでしたが、何度もLinux上でコードを実行しました。 –

+0

@AlexErwin:発生しているエラーと一緒に、実際のコードを投稿できますか? –

+0

コードが豊富なので、私はここでそれを行う方法がわかりません。しかし、apr_table_t構造体のスニペット 'struct apr_table_entry_t { char * key; char * val; apr_uint32_t key_checksum;私は現時点でエラーを複製する立場にはいませんが、この関数を実行すると、(APR_DECLARE(void)apr_table_set(apr_table_t * t、const char * key、 const char * val); void *とタイプされた変数は、コンパイラが気を失い、私がそれを行うことができないと言っています。私はC++コンパイラを使用しているからでしょうか? –

関連する問題