レガシーコードからgcc警告を削除しています。解決方法:Cコードで「異なるサイズの整数からポインタへキャスト」警告?
は型キャストを通じて、「異なるサイズの整数からポインタにキャスト」警告を抑止することが可能です:
example:
some_struct *ptr = func() // func() returns an integer.
を誰かが、このようなgccの警告を解決する方法を私を導いてくださいことはできますか?
レガシーコードからgcc警告を削除しています。解決方法:Cコードで「異なるサイズの整数からポインタへキャスト」警告?
は型キャストを通じて、「異なるサイズの整数からポインタにキャスト」警告を抑止することが可能です:
example:
some_struct *ptr = func() // func() returns an integer.
を誰かが、このようなgccの警告を解決する方法を私を導いてくださいことはできますか?
まず、func
を修正して(そのソースを変更することが許可されている)、修正してください。ポインターで計算を行うことができれば、ポインターとリターンポインターでそれらを実行します。場合によっては、アドレスを整数として扱う有効な理由があります(たとえば、特殊コードの配置問題を扱うなど)。その場合はにuintptr_t
タイプ(stdint.h
で定義)を使用するように変更してください。必要に応じてポインタを整数として扱うように設計されています。 (何らかの理由で符号付き算術が優れている場合はintptr_t
もありますが、一般的には符号なしuintptr_t
が面倒ではありません。)好ましくは、それを返すときfunc
はポインタにuintptr_t
を変換する必要があり、そうfunc
の戻り型は何か、おそらくsome_struct
又はvoid
へのポインタ()であろう。
func
を修正できない場合は、キャストを使用して、実行中の変換を実行することをコンパイラに指示できます。しかし、この特定のエラーメッセージは、単にポインタを整数に変換されていないことを通知されますが、他のサイズ(例えば、8バイト)のポインタにワンサイズ(例えば、4バイト)の整数に変換されます。このコードは、もともとfunc
によって返された整数型がポインタ型と同じサイズを持っていたシステムのために書かれたそうですが、あなたは今、ポインタ型は、その整数のサイズよりも大きいか、小さいシステムでコンパイルされています。
この場合、func
によって実行された計算が新しいアーキテクチャで機能することを確認する必要があります。 32ビットの値しか返さない場合は、常に正しい値を保持しますか?つまり、上位32ビットが欠けても何も失われません。 func
が計算するアドレスは、それが使用する整数型の最大値を超えることはありませんか? func
が符号付き整数型を使用している場合は、符号ビットも考慮してください。
func
によって返される値が正しいことを確認した場合は、some_struct *ptr = (some_struct *) (intptr_t) func();
などの明示的なキャストを使用できます。
私のgccはあなたが引用した警告を表示しません。あなたのコードにキャストがないので、それはまた不思議です。
私は警告
assignment makes pointer from integer without a cast
を取得するには、 "キャストなし" の部分に注意してください。あなたが合わないfunc
の戻り値の型IFFあなたの警告(「異なるサイズの整数からポインタへのキャスト」)を取得します、そして、
some_struct *ptr = (void*)func();
:したがって、あなたは(動作を変更せずに)キャスティングすることによりサイレントgccを作ることができます住所用。これは、適切な整数型に、例えば、func()
をさらに流し込むことによって沈黙させることができる。 intptr_t
:あなたは本当にポインタに間違ったサイズの整数に変換したいという仮定の下で
some_struct *ptr = (void*)(intptr_t)func();
このすべて。おそらく、コードを修正する方が良い考えです。
二つの可能性がここにあります
func
は、整数への実際のポインタをキャストしています。後にポインタとして使用されます。func
は、ポインタに格納されている整数を返しています。 ptr
は後に整数にキャストされ、整数として使用されます。最初のケースでint
は、Windowsを含むことが最も64-bit memory modelsになり、データポインタ、(のサイズよりも小さい場合、func
からの戻り値は、情報を失い、そして潜在的にクラッシュしたり悪化しますおよびLinux)。その場合は、返品タイプfunc
をintptr_t
に変更してください。 Using intptr_t instead of void*?およびWhy/when to use `intptr_t` for type-casting in C?を参照してください。
第2のケースでは問題は少なくなりますが、エンディアンの問題に対処するには、intptr_t
:some_struct *ptr = (some_struct *)(intptr_t)func();
以降、int value = (int)(intptr_t)ptr;
にキャストする必要があります。この問題の説明については、GLib Type Conversion Macrosを参照してください。
なぜstructポインタに整数を配置したいのですか? – Jay
それは可能ですが、それが正しい方法で行くケースはまれです。 –
"出力"差異の過負荷ですか?(入力パラメータではありません) –