2011-07-11 18 views
9

私のコードの次の部分は、Visual Studioで値を印刷しません。%zd printf形式がVS2010で動作しないのはなぜですか?

int main() { 
    intptr_t P = 10; 
    printf("test value is %zd",P); 
    return 0; 
} 

OUTPUT:

test value is zd 

Iは、上記コード印刷

test value is 10 

を期待する32ビットの両方で調整するためのコードを作るように私の代わりに整数intptr_t使用してい64ビットアーキテクチャ

+0

にあなたはVSでのIu%を使用する必要がsize_tの印刷および%のZUするには一貫性のインデントスタイルを使用してください。私たちとあなたのコードを読むのに役立ちます。 – bdonlan

+0

@bdonlanとバート、提案のおかげで、私はすべての:) – thetna

答えて

4

zプレフィックスがprintfのMicrosoftのバージョンで定義されていません。私はI接頭辞が機能するかもしれないと思います。 z長さ指定がC99でサポートされていますがhttp://msdn.microsoft.com/en-us/library/tcxf1dw6.aspx

4

を参照してください、Visual Studioの2010 C99をサポートし、代わりにz長さ指定子がありませんでしたCの古いバージョンに準拠していません。拡張機能として、VS2010はsize_tの代わりにI length specifierをサポートしていますが、他のプラットフォームには移植できません。

私の代わりに%llu指定子でunsigned long longを使用することをお勧めします。オーバーヘッドは最小限であり、C99プラットフォームにも移植可能です。

+1

のためのMSのドキュメントは '%のlld'オプションとして'%のllu'を許可していません申し訳ありません。また、パラメータを適切なサイズにキャストする必要があります。 –

+0

@Mark Ransomは、署名されていないintgerに対しても** uintptr_t **を使用したいと考えています。この場合、私には何をお勧めしますか? – thetna

+0

http://stackoverflow.com/questions/9610747/which-c99-features-are-available-in-the-ms-visual-studio-compiler –

2

携帯コードの場合は、printfフォーマット文字列に#include <inttypes.h>PRIdPTRを使用してください。

printf("test value is %" PRIdPTR, P); 

Wikipedia page for inttypes.hは、Visual C++で動作します、と(Microsoftがinttypes.hを追加しなかった場合)、おそらく同様にVS2010で動作するでしょう、そのファイルのバージョンへのリンクがあります。

PRIdPTRintptr_tPRIuPTRuintptr_tです。

+1

inttypes.hは、ここでは、現在だ[、VS2012でまだそこにいないので、今code.google.comに、前述の実施タム](https://code.google.com/p/msinttypes/) –

0

をgccの

関連する問題