4

MSDOS、Windows 32 コンソール モード、Windows 32 GUI モード、Linux 32、および Linux 64 など、複数のアーキテクチャ (すべて x86) で警告なしにコンパイルし、問題なく実行できるコード ベースがあります。

Linux 64 のサポートを追加する前は、これは簡単でした。ほとんどすべてのデータはint、BYTE、WORD、および DWORD の typedef として、または typedef から宣言されました。

typedef unsigned char   BYTE;
typedef unsigned short  WORD;
typedef unsigned long   DWORD;

64 ビット gcc サポートを追加する際、DWORD は保存されたデータを表すため、32 ビット値のままにするために少し調整する必要がありました。

// to compile DWORDs as 32 bits on 64-bit machines:
#if __x86_64__
 typedef unsigned int    DWORD;
#else
 typedef unsigned long   DWORD;
#endif

そして、これはすべての環境でうまく機能しました:

DWORD   data;
printf ("%lu", data);

ただし、gcc -Wallフォーマット変換について不平を言うようになりました。

warning: format ‘%ld’ expects argument of type ‘long int’, but argument
         1 has type ‘DWORD {aka unsigned int}’ [-Wformat]

このコードは膨大な書式設定 (何千行もの出力書式設定) を行うため、タイプ固有のフォーマッタを改造したくありません。修飾子を使用して、z同様の質問に回答しました。

printf ("%zu", data);

しかし、これにより、MSDOS および Win32 コンソールの Turbo C は奇妙なことを行います%zu。何も変換するのではなく、変換仕様を出力として表示します。

printf の粒度と基本的なデータ型に合わせて、型の可変性を処理するよりクリーンな方法はありますか?

4

1 に答える 1