0

msvc と gcc の両方で x86-32 と x86-64 の互換性を保つために使用する必要がある #ifdefs を知っていると思います。以下を参照してください。これは、これらのプラットフォームで完全ですか?

#if defined(_MSC_VER)
#  if defined(_M_IA64) || defined(_M_X64)
#    define SIZEOF_SIZE_T 8
#    define SIZEOF_VOIDP  8
#  elif defined(_M_IX86)
#    define SIZEOF_SIZE_T 4
#    define SIZEOF_VOIDP  4
#  else
#    error "Unsupported MSVC platform"
#  endif
#elif defined(__GNUG__)
#  if defined(__x86_64__) || defined(__ia64__)
#    define SIZEOF_SIZE_T 8
#    define SIZEOF_VOIDP  8
#  elif defined(__i386__)
#    define SIZEOF_SIZE_T 4
#    define SIZEOF_VOIDP  4
#  else
#    error "Unsupported GCC platform"
#  endif
#endif

IA64 と x86 64 は C プログラマーの観点から同じですか?

また、Mac でコンパイルできるようにしたいと考えています。何を追加しますか?

編集:のようなものを使用する手に負えないレガシーコードを扱っているため、sizeof() を使用できません#if SIZEOF_VOIDP == SIZEOF_LONG。また、実際のコンテンツではなく、アーキテクチャのみに興味があります。プリコンパイラでは許可されないことに注意してください#if sizeof(size_t) == sizeof(void*)

4

8 に答える 8

6

ビルドシステムを使用してこれらを定数として生成するのはどうですか

#include <stdio.h>

int main()
{
   printf(
      "#if !defined ARCH_MODEL_CONSTANTS_H\n"
      "#define ARCH_MODEL_CONSTANTS_H\n"
      "\n"
      "#    define SIZEOF_LONG  %u\n"
      "#    define SIZEOF_VOIDP %u\n"
      "\n"
      "#endif\n",
      (unsigned)sizeof(long),
      (unsigned)sizeof(void *) ) ;

   return 0 ;
}

ビルド システムに一貫性があり、すべてが同じオプションでビルドされている場合、これにより暗黙の移植性が構築され、ifdef64sizeof(long)ビット ia64 および x64 ウィンドウ (gcc を使用しても非ウィンドウを意味すると想定したコンパイラ)。

別の回答で言及されている静的アサートでこれをバックアップすると、両方の長所が得られます。

于 2009-12-17T15:14:39.680 に答える
2

これらの定義はすべて、私にはかなり冗長に見えます。sizeof(void*)と友達を使うだけです。

定数を定義する必要がある場合は、次のように定義します

#define SIZEOF_VOIDP sizeof(void*)
于 2009-12-17T12:07:53.750 に答える
1

#define SIZEOF_LONG 8とについて考慮すべき1つのポイント#define SIZEOF_VOIDP 8

HP-UX IA64では、このプログラムは次のとおりです。

#include <iostream>

int main()
{
#if defined(__ia64__) && defined(__GNUG__)
    std::cout << sizeof(long) << std::endl;
    std::cout << sizeof(void*) << std::endl;
#endif
    return 0;
}

このようにコンパイルされた場合:

g++ -mlp64 main.cpp

与える:8 8

しかし、このようにコンパイルされた場合:

g++ -milp32 main.cpp

44を与える

于 2009-12-17T12:27:44.233 に答える
1

sizeof 演算子を使用しないのはなぜですか?

sizeof(long);
sizeof(int);
sizeof(void*);
于 2009-12-17T12:07:36.103 に答える
0

いいえ、完全ではありません。

sizeof (char)すべてのプラットフォームで同じであること、コンパイラ オプションなどだけです。
他のすべての型が同じであるとは限りません。さまざまなオプションを使用してコンパイルした後も同じままであるとは限りません。

あなたが必要

sizeof (short)
sizeof (int)
sizeof (long)
sizeof (long long) // C99
sizeof (float)
sizeof (double)
sizeof (long double) // C99
sizeof (void *)
sizeof (char *)
sizeof (long double *) // C99

...
于 2009-12-17T12:13:25.053 に答える