2016-10-23 18 views
3

でsize_tのは、あなたが次のコードスニペットを持っていると仮定します。印刷OSに依存しないアーキテクチャに依存しない方法

include <stdio.h> 
size_t nodeID = 5; 
printf("nodeID = %lu", nodeID); 

これは、64ビットシステム上で提起されている任意の警告なしに実行されますが、%の変換警告を生成します。 32ビットシステムではluです。

我々は、これは「I」修飾子を使用するVisual Studioの上では動作しません。しかし%z modifier

を使用してそれに対処することができます。

アーキテクチャに依存しない、OSに依存しない方法でこれを解決する方法はありますか?あなたはIIRC、これは古いMSのコンパイラとの互換性の問題を有していてもよく言うようにかかわらず、

#include <stdio.h> 
size_t nodeID = 5; 
printf("nodeID = %zu\n", nodeID); 

:あなたが言うように

+0

すべてのCPU環境で 'nodeID'のサイズが同じになっていない方が良いでしょうか?あなたは 'uint64_t'または' uint32_t'を宣言することができます。これは、プログラムが動作を変更しないようにするためで、x86とx64で異なる動作をしたくない場合です。 –

+0

あなたは10分割で独自の印刷方法を書くことができます。 –

+2

''%zu ''フォーマットは、標準的で独立した方法であるはずです。残念なことに、Visual Studio Cコンパイラは、次の標準規格では、長い間スキップしなければなりませんでした。最後の2つのリリース(2013年と2015年)には完全なC99互換性が必要です。 –

答えて

5

は、あなたがz修飾子を使用することができます。 、

#ifdef _MSC_VER /* Untested MSC detection */ 
#define PRIuSIZE Iu 
#else 
#define PRIuSIZE zu 
#endif 
#define QUOTE(name) #name 
#define STR(macro) QUOTE(macro) 
#define USIZE_STR STR(PRIuSIZE) 

#include <stdio.h> 
size_t nodeID = 5; 
printf("nodeID = %" USIZE_STR "\n", nodeID); 

それはあなたファイルでの条件付きプリプロセッサマクロに依存しないという意味でアーキテクチャやOSに依存しないで別の方法を、次のようになります。あなたのようなものでこれを回避することができる場合があります

#include <stdio.h> 
#include <inttypes.h> 
size_t nodeID = 5; 
printf("nodeID = %" PRIu64 "\n", (uint64_t) nodeID); 

これは明らかに小さいか、私はそれが常にあると考えている64ビット長で、に等しいsize_tに依存しています。

+1

"...私はいつもそれが信じています。" - 信じるのはプログラミングのための悪いアドバイスです。上限はありません。 '%zu'がなければ、完全に準拠した方法がないので、'%zu'が導入されました。 – Olaf

+1

'size_t'は' uintmax_t'より大きいことはできませんので、 'uintmax_t'を強要し、' PRIuMAX'を使って正しい書式文字を得ることができます。しかし、もしあなたが ''ヘッダと 'uintmax_t'を持っていれば、あなたは'%zu'も利用できる可能性が高いでしょう。同様のコメントが 'uint64_t'にも適用されます。 –

関連する問題