2009-10-12 11 views
6

一部のCコードをTI DSPチップ環境に移植しています。私はCコンパイラに取り組んでいます。ポインタと関数ポインタ間の型キャスト時の警告

私は、関数へのポインタを含むデータ構造を持っています。私はデータ構造を初期化する関数を持っています。 Visual StudioとGCCの下では、この種のコードは苦情なしでコンパイルされます。実際には、pfn引数がタイプvoid *なので、実際にキャストする必要はありません。それは単に黙示的に苦情なしに出演するだけです。 TI DSPチップ用のCode Composer Studioの

、私は「警告:無効な型変換」を取得

私のポリシーは警告なしに私のコードのコンパイルをすることですので、私はこの問題を解決したいが。私はあらゆる種類のキャストを試みました。 ポインタをintにキャストしてから、正しい型にキャストすると、コンパイラが完全に満足していることがわかりました。うん、うん!

コンパイラを使用せずにこのキャストを行うにはどうすればよいですか?コンパイラをシャットダウンするには、実際にintにキャストする必要がありますか?

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

+0

正しいタイプの契約があり、pfnタイプPFN_FOOにするのは簡単ではないでしょうか?別のポイント - あなたは明示的な型をinit_struct()に与えるべきです。 VC++ 2008でCコンパイルを使用しても警告なしでコンパイルされません。 – Clifford

+0

@Clifford、私の実際のコードは常に関数に明示的な型を持っています。私は警告なしでコンパイルするために自分のコードを書いています。私は型に注意しています。私が解決しようとしている問題は、異種のものを持つことができるデータ構造を初期化する関数を作成することであり、内部に格納されているデータ型ごとにinit関数が1つではありません。 – steveha

答えて

12

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

関数を標準に準拠させたい(ただし、まだvoid *パラメータを使用しています)場合は、代わりに関数ポインタへのポインタを渡すことができます。

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

呼び出し側はその後、ときにポインタを渡すために、一時的なPFN_FOOオブジェクトを作成する必要があります。機能はとても関数ポインタへのポインタがうまくvoid *にしてから変換することができ、自身が通常のオブジェクトであるポインタので、これは動作します

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

うわー、これはTI Cだと思っていたけど、それはCの標準的なことだと言っている。それはとても役に立ちます。 – steveha

+1

さて、私は関数を書き換えて 'void *'を取るのではなく、 'typedef void(* PFN)();'というように定義された 'PFN'を取ります。特定のPFN型にキャストされる前に、関数への何らかのポインタとして開始するだけで十分です。ありがとうございました!回答は受け入れられ+1。 – steveha

+0

それは間違いなく、異なる関数のポインタ型の間で自由に変換することができます。 – caf

3

あなたは書きませんか?

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

このtutorialを参照してください。

+0

はい、はい。私はそれが実際のコードでは正しいが、私は正しい私の愚かな例のコードを変更します。さて、あなたは実際の質問についてアドバイスをしていますか? – steveha

+0

明確にするために、問題が私のコードでPFN_FOO型を正しく宣言していないと思われるかもしれません。これは問題ではなく、コードは実際にはうまく機能しますが、TI DSP Cコンパイラが警告を出しています。 – steveha

+0

CまたはC++としてコンパイルしていますか? – dirkgently

関連する問題