2017/05/12

[clang]uint64_tのprintf

最近、64bit型を使うことが増えてきた。
その場合は、uint64_tにしている。

デバッグで値を標準出力に出したい場合、printf()を使っている。
そのとき、"%d"なんか使うと、warningが出てしまう。

今使っている環境では、

printf("%llu\n", (unsigned long long)value);

などとしている。

 

これでも困りはしないのだが、キャストが長すぎる。
確か、uintXX_t系の書式が定義されていたはずだ。。。


困ったときは、オライリーのCクイックリファレンスだ。
さすがにここは、古い本には載っていない。

目次で見つけたのは、「第18章 標準ライブラリ関数」のprintfだ。
持っている本では、p.520の表18-9に載っていた。stdint.hで定義されているらしい。
ふむふむ、uint64_tで16進数だったら「PRIx64」でよいようだ。

#include <stdio.h>
#include <stdint.h>


int main(int argc, char *argv[])
{
    uint64_t val = 0x123456789abcdef0ULL;

    printf("val = %" PRIx64 "\n", val);
    return 0;
}

しかし・・・コンパイルエラーが出る。。。

 

なぜだ。。。
他のページを見直すと、「16.3 標準ヘッダの内容」にも同じような内容が書かれていた。
しかし、p.287を見ると「<inttypes.h>」となっている。

#include <stdio.h> #include <inttypes.h> int main(int argc, char *argv[]) { uint64_t val = 0x123456789abcdef0ULL; printf("val = %" PRIx64 "\n", val); return 0; }

コンパイルが通るではないか!

というわけで、p.520の表18-9は、stdint.hにあるのは整数型の型だけで、変換して石マクロはinttypes.hにあるのを覚えておきましょう。


ちなみに、今回使った「PRIx64」がどういうマクロなのか、printf("%s\n", PRIx64)で見てみました。

lx

えー、そうなの。。。

ちなみに、

PRIu64 : "lu"
PRIi64 : "li"

でした(Bash on Windows)。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。

注: コメントを投稿できるのは、このブログのメンバーだけです。