とき型キャストポインタと関数へのポインタとの間に警告

StackOverflow https://stackoverflow.com/questions/1556651

  •  21-09-2019
  •  | 
  •  

質問

私は、TIのDSPチップ環境にいくつかのCコードを移植しています。私はCコンパイラに取り組んでいます。

私は、関数へのポインタを含むデータ構造を有しています。私は、データ構造を初期化する機能を持っています。このような何かます:

typedef void (*PFN_FOO)(int x, int y);

struct my_struct
{
    PFN_FOO pfn;
};

init_struct(struct my_struct *p, void *pfn)
{
    p->pfn = (PFN_FOO)pfn;
}

Visual StudioとGCCの下では、コードのこの種は、苦情なしでコンパイルされます。 pfn引数の型がvoid *あるので実際に、私は本当にそこでもキャストを配置する必要はありません。それだけで暗黙的に文句なしにキャストします。

TI DSPチップ用のCode Composer Studioので、私は "無効な型変換の警告" を取得します

私のポリシーは、警告なしに私のコードのコンパイルをすることですので、私はこの問題を解決したいです。私は鋳造のすべての種類を試してみました。私が最初にvoid *ために私intポインタをキャストした場合、コンパイラは完全に満足していることを発見し、正しい型にキャスト。 EW、不潔!

どのように私は文句コンパイラなしでこのキャストを行うことができますか?私は実際にコンパイラを黙らせintにキャストする必要がありますか?

注:私は特に、のないの「代わりinit_struct()PFN_FOOを受け入れるようにvoid *を変更」の効果を解決するために探しています。つまり、この単純化されたコードスニペットのために働くだろうが、おそらく異質のもののリストを作成し、実際のコードのために動作しません。

役に立ちましたか?

解決

標準Cは、具体的関数へのデータオブジェクトへのポインタとポインタとの間の変換をサポートしていません。 GCCとVisual Studioは、拡張機能としてこれをサポートしています。

あなたは、機能の標準準拠を作る(まだvoid *パラメータを使用)したい場合は、

、あなたの代わりに関数ポインタへのポインタを渡すことができます。

:関数はとても関数ポインタへのポインタがうまくvoid *にしてから変換することができ、自身が通常のオブジェクトであるポインタので、これは動作します
init_struct(struct my_struct *p, void *pfn)
{
    PFN_FOO *foo = pfn;
    p->pfn = *foo;
}

呼び出し側は、それが呼び出しを行うときにポインタを渡すために、一時的なPFN_FOOオブジェクトを作成する必要があります

PFN_FOO fp = &somefunc;
/* ... */
init_struct(p, &fp);

他のヒント

あなたが書くべきではないでしょうか。

typedef void (*PFN_FOO)(int x, int y);

このチュートリアルのを参照してください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top