web-dev-qa-db-ja.com

うーん、あなたはPRIu64ですか?

私はCが初めてで、次のことに直面しています。

#include <stdio.h>
#include <inttypes.h>

int main(void)
{
    uint64_t foo = 10;
    printf("foo is equal to %" PRIu64 "!\n", foo);

    return 0;
}

そしてそれは動作します!理由がわかりませんか?誰かがこれについて私を助けることができますか?どうもありがとう!トル

53
torr

PRIu64 は、C99で導入されたuint64_t、ここでuint64_tは(リンクされたリファレンスページから):

それぞれ幅が64ビットの符号なし整数型(実装が直接型をサポートする場合にのみ提供)

PRIu64は文字列(リテラル)で、たとえば次のとおりです。

printf("%s\n", PRIu64);

私のマシンでlluを出力します。 C99標準のセクション6.4.5文字列リテラルから、隣接する文字列リテラルが連結されます。

変換フェーズ6では、隣接文字とワイド文字列リテラルトークンのシーケンスで指定されたマルチバイト文字シーケンスは、単一のマルチバイト文字シーケンスに連結されます。トークンのいずれかがワイド文字列リテラルトークンである場合、結果のマルチバイト文字シーケンスはワイド文字列リテラルとして扱われます。それ以外の場合は、文字列リテラルとして扱われます。

これの意味は:

printf("foo is equal to %" PRIu64 "!\n", foo);

(私のマシン上)は次と同じです:

printf("foo is equal to %llu!\n", foo);

http://ideone.com/jFvKR9 を参照してください。

66
hmjd