[解決済み] ino_tのようなサイズ不明の型はどうすれば印刷できますか?
質問内容
で印刷したい場面はよくあります。
printf
実装で定義されたサイズの整数型(例えば
ino_t
または
time_t
). 今現在、私はこのようなパターンを使っています。
#include <inttypes.h>
ino_t ino; /* variable of unknown size */
printf("%" PRIuMAX, (uintmax_t)ino);
この方法は今のところうまくいっていますが、いくつかの欠点があります。
- 印刷しようとする型が符号付きか符号なしかを知っておかなければならない。
- 型キャストを使用しなければならないので、コードが大きくなる可能性がある。
もっと良い方法はないでしょうか?
どのように解決するのか?
#include <inttypes.h>
ino_t ino; /* variable of unknown size */
/* ... */
printf("%" PRIuMAX, (uintmax_t)ino);
それは確かにうまくいくだろうが(いくつかの但し書きがある。
printf("%ju", (uintmax_t)ino);
は
j
長さ修飾子
以下のように指定します。
d
,i
,o
,u
,x
またはX
変換指定子が適用されるのはintmax_t
またはuintmax_t
引数、または以下のn
変換 へのポインタに適用されます。intmax_t
の引数になります。
もあります。
z
と
t
のモディファイアは
size_t
と
ptrdiff_t
(と、それぞれ対応する符号付き型/符号なし型)。
また、個人的には
<inttypes.h>
は醜く、覚えにくいので、私は
"%ju"
または
"%jd"
.
ご指摘の通り、型(
ino_t
この場合、符号付きか符号なし)。たまたまそれがわからなかったとしても、解明することは可能です。
#include <stdio.h>
#include <stdint.h>
#include <sys/types.h>
#define IS_SIGNED(type) ((type)-1 < (type)0)
#define DECIMAL_FORMAT(type) (IS_SIGNED(type) ? "%jd" : "%ju")
#define CONVERT_TO_MAX(type, value) \
(IS_SIGNED(type) ? (intmax_t)(value) : (uintmax_t)(value))
#define PRINT_VALUE(type, value) \
(printf(DECIMAL_FORMAT(type), CONVERT_TO_MAX(type, (value))))
int main(void) {
ino_t ino = 42;
PRINT_VALUE(ino_t, ino);
putchar('\n');
}
が、これはやりすぎかもしれません。もし、型が64ビットより狭いことが確かなら、その値を
intmax_t
で、その値は保存されます。あるいは
uintmax_t
を印刷し、すべての値について明確に定義された結果を得ることができます。
-1
として
18446744073709551615
(2
64
-1)は、少しわかりにくいかもしれません。
これらはすべて、C言語の実装が以下のものをサポートしている場合にのみ機能します。
<stdint.h>
と、その
j
の長さ修飾子です。
printf
-- つまり、C99をサポートしているかどうかです。すべてのコンパイラがそうであるとは限りません (
せき
マイクロソフト
咳
). C90の場合、最も広い整数型は
long
と
unsigned long
に変換して使用することができます。
"%ld"
および
"%lu"
. 理論的には、C99準拠のテストは
__STDC_VERSION__
定義済みマクロ -- ただし、C99以前のコンパイラの中には、まだ
long
と
unsigned long
を拡張子として使用します。
関連
-
[解決済み】Cコンパイルエラー。"変数サイズのオブジェクトが初期化されていない可能性がある"
-
[解決済み】valgrind - サイズ8のブロックが割り当てられた後、アドレス ---- が0バイトになる。
-
[解決済み】未定義参照 makefile が間違っているのかも?
-
[解決済み】C言語でpow( )への未定義参照、math.hを含むにもかかわらず【重複】。
-
[解決済み] printf ファミリーを使用して、size_t 変数をポータブルに印刷するにはどうすればよいですか?
-
[解決済み] off_tやsize_tのような型はどのように印刷すればよいのですか?
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
-
[解決済み] C言語で配列のサイズを決定するにはどうすればよいですか?
-
[解決済み】C言語の関数ポインタはどのように機能するのですか?
-
[解決済み】SO_REUSEADDRとSO_REUSEPORTはどう違うのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】stdinとSTDIN_FILENOの違いは何ですか?
-
[解決済み】単項演算子「*」の型が無効(「int」がある)C言語でのエラー
-
[解決済み】 `S_ISREG()` とは何ですか、そして何をするのですか?
-
[解決済み】ISO C90では、C言語での宣言とコードの混在が禁止されています。
-
[解決済み] clang: error: linker command failed with exit code 1が表示されるのはなぜですか?
-
[解決済み】メモリー・クロバリング・エラー
-
[解決済み】C 未知の型名「my_structure」。
-
[解決済み】EAGAINとはどういう意味ですか?
-
[解決済み】Linuxでexeclp()がどのように動作するのか理解できません。
-
[解決済み】argv[]をint型として取得するには?