0

32 ビットを 64 ビット コードに移植しようとしていましたが、移植に関して標準的なルールがあるかどうか疑問に思っていました。

コードを 64 ビット環境でコンパイルしたところ、次のようなエラーが発生しました。

ポインタから異なるサイズの整数へのキャスト [-Werror=pointer-to-int-cast]

x = (int32_t)y;

これを取得するには、 x = (size_t)y; を使用します。私はエラーを取り除きますが、これは正しい方法です。また、さまざまな場所で、変数を (unsigned long long) にキャストする必要があります。例えば

printf("Total Time   : %5qu\n",time->compile_time

これにより、エラー エラーが発生します。形式 '%qu' は型 'long long unsigned int' の引数を期待していますが、引数 2 の型は (XYZ) です。

これを修正するには、次のようなことをします

 printf("Total Time   : %5qu\n",(unsigned long long) time->compile_time

またこれは適切ですか??

4

2 に答える 2

2

yこの場合、それはポインターであると想定しても安全だと思います。

代わりにorsize_tを使用する必要があります。intptr_tuintptr_t

size_t と uintptr_tを参照してください。

あなたの 2 番目のキャストに関しては、適切とは何を意味するかによって異なりますか?

通常のアドバイスは、キャストを避けることです。ただし、プログラミングのすべてのものと同様に、それらが利用可能である理由があります。malloc組み込みシステムでの実装に取り​​組んuintptr_tでいるとき、必要な演算を実行できるようにするために、ポインターをキャストする必要がありました。このコードは 64 ビット PC でテストされましたが、32 ビット マイクロ コントローラで実行されました。2 つのアーキテクチャを使用したという事実は、ある程度移植可能なコードであることを保証する最良の方法でした。

ただし、キャストすると、コードは基になる型がどのように定義されているかに依存します! この行で気付いたようにx = (int32_t)y、コードはポインターが 32 ビット幅であるという事実に依存していました。

私があなたにできる唯一のアドバイスは、あなたのタイプを知ることです. キャストしたい場合は問題ありませんが (最初から正しい型の変数を作成できない限り)、キャストする「正しい」型を選択しない限り、移植性が低下する可能性があります。

printfキャストも同様です。もし私があなたなら、%5qu最初に の定義を徹底的に読みます (これが役立つかもしれません)。次に、適切に型指定された変数 (または逆に別の書式文字列) を使用しようとし、それが失敗した場合にのみキャストを使用します。

使用したことはありませんが、 64 ビットの unsigned int%quとして解釈するので、使用してみます(すべてのプラットフォームで 64 ビットであることが保証されていないため)。ウィキペディアで読んだことによると、指定子は最初はプラットフォーム固有であるため、変更するのが賢明かもしれません。uint64_tlong longq

これ以上だと、質問が広範になりすぎます (特定の例に固執したのは良いことです)。行き詰まった場合は、確認したい個々のタイプに戻って、それらについてのみ質問してください。

于 2013-11-06T20:34:44.790 に答える
1

壊れたものを支えているので、それを「キャスト」と呼ぶと言ったのはストロストラップでしたか? ;-)

 x = (int32_t) y;

この場合、正確な幅タイプを使用しているため、実際には x と y が何であるかに依存します。エラー メッセージは、y がポインターであることを示唆しています。ポインターは int32_t ではないため、本当の問題は、なぜ y が x に割り当てられているのかということです...潜在的な問題を示している可能性があります。それをキャストすると、問題がカバーされるだけで、コンパイル時ではなく実行時に問題が発生する可能性があります。コードが何をしていると考えているかを把握し、コードに合わせて型を「再調整」します。(size_t) キャストを使用するとエラーがなくなる理由は、ポインタが 64 ビットで size_t が 64 ビットである可能性が高いためですが、単純な形式のランダム キャストの運が良いと考えることができます。(unsigned long long) にキャストする場合も同様です。int が 32 ビットまたは 64 ビットであると仮定したり、キャストを移植ツールとして使用したりしないでください。問題が発生します。これ' 1 行のコードに基づいてより具体的にするのは困難です。問題のある 25 行未満の関数を投稿する場合。より具体的なアドバイスが得られるかもしれません。

于 2013-11-06T20:45:52.373 に答える