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