0

C++ と古き良き Windows アプリケーション モデルを使用する 32 ビット Windows アプリケーションがあります。単一のソースを用意し、コンパイラ スイッチをオンにしたり、いくつかのマクロを使用したりして、32 ビットと 64 ビットとしてコンパイルすることは技術的に可能ですか?

現在、コードが 64 ビット アプリケーションとしてコンパイルされるとは思いません。コンパイル エラーを修正する必要があります。一般に、64 ビット アプリケーションと 32 ビット アプリケーションの両方としてコンパイルするにはどうすればよいでしょうか。何を覚えておくべきですか?課題は何ですか?コメントやヒントをいただければ幸いです。ありがとう

4

4 に答える 4

3

コンパイラは、ターゲット プラットフォームに応じてマクロを定義します。たとえば、GCC は と を定義__i386____amd64__、MSVC は_M_IX86_M_X64を 32 ビットと 64 ビットにそれぞれ定義します。たとえば、これらのマクロをプリプロセッサ#ifdefステートメントで使用して、コンパイルの流れを指示することができます。

さまざまなコンパイラの事前定義された C/C++ コンパイラ マクロに関する優れたソースがあります。

于 2013-09-11T16:35:34.633 に答える
3

注意すべきことは? 課題は?」 について、32 ビットから 64 ビットにコードを移植する際に遭遇する最も一般的な問題は次のとおりです。

  • ポインタが4バイトであると仮定
  • sizeof(int) == sizeof(pointer) と仮定すると、
  • sizeof(int) == sizeof(size_t) と仮定すると、
  • インライン/ハードコードされた x86 アセンブリ

/W4( Microsoft のコンパイラまたはgcc で)コンパイルするときは、最も厳密な警告レベルを使用して-Wall -Wextra -pedantic-errors、大きな型から小さな型への変換をキャッチできるようにしてください。

これは Microsoft の移植ガイドですが、他のコンパイラにも適しています。

于 2013-09-11T16:53:49.343 に答える
0

移植中の最大の問題は、あちこちでさまざまな型の sizeof() が異なることです。そのため、32 ビットで正しく実行されるコードの一部が、64 ビットでは時限爆弾効果を引き起こす可能性があります。たとえば、次のようなコードを作成できます。

size_t sz = GetSomethingBig();
DWORD dw = (DWORD)sz;

したがって、32 ビットでは、size_t と DWORD の両方のタイプが同じサイズ (4 バイト) になります。移植版では、size_t は 8 バイト長ですが、DWORD は同じです。生の C スタイルの型キャストを行うため、コンパイル エラーは発生しません。実行時に、sz が 0x100000000 未満であれば、すべて問題ありません。他のすべての値はデータの損失を引き起こし、影響を予測するのは困難です。

于 2013-09-11T16:47:54.463 に答える