[解決済み] C++ で size_t を printf するためのきれいなコード (または: C99 の %z に最も近い C++ のコード)
2022-12-07 23:06:33
質問
C++のコードで
size_t
:
size_t a;
printf("%lu", a);
32ビットと64ビットの両方のアーキテクチャで、警告を出さずにコンパイルできるようにしたいです。
もしこれがC99だったら、私は
printf("%z", a);
. しかし、AFAICTは
%z
はどの標準的なC++の方言にも存在しません。 ですから、代わりに、私は
printf("%lu", (unsigned long) a);
というのは実に醜い。
を印刷する機能がない場合
size_t
を印刷する機能がないのであれば、printf のラッパーなどを書いて、適切なキャストを
size_t
に適切なキャストを挿入して、良い警告を維持しながら偽のコンパイラ警告を排除するような、printf のラッパーか何かを書くことは可能でしょうか。
何かアイデアはありますか?
編集 私がprintfを使用している理由を明確にするために。私は比較的大きなコードベースを持っていて、それを整理しているところです。 それは、警告を書き、それをファイルに記録し、場合によってはエラーでコードを終了する"といったことを行うためにprintfラッパーを使用しています。 cout ラッパーでこれを行うために十分な C++ フーを呼び出すことができるかもしれませんが、コンパイラの警告を取り除くためだけにプログラム内のすべての warn() 呼び出しを変更するのは避けたいのです。
どのように解決するのですか?
ほとんどのコンパイラは、独自の仕様で
size_t
と
ptrdiff_t
の引数は、例えば Visual C++ ではそれぞれ %Iu と %Id を使いますが、gcc では %zu と %zd を使えるようになると思います。
マクロを作ればいいんじゃない?
#if defined(_MSC_VER) || defined(__MINGW32__) //__MINGW32__ should goes before __GNUC__
#define JL_SIZE_T_SPECIFIER "%Iu"
#define JL_SSIZE_T_SPECIFIER "%Id"
#define JL_PTRDIFF_T_SPECIFIER "%Id"
#elif defined(__GNUC__)
#define JL_SIZE_T_SPECIFIER "%zu"
#define JL_SSIZE_T_SPECIFIER "%zd"
#define JL_PTRDIFF_T_SPECIFIER "%zd"
#else
// TODO figure out which to use.
#if NUMBITS == 32
#define JL_SIZE_T_SPECIFIER something_unsigned
#define JL_SSIZE_T_SPECIFIER something_signed
#define JL_PTRDIFF_T_SPECIFIER something_signed
#else
#define JL_SIZE_T_SPECIFIER something_bigger_unsigned
#define JL_SSIZE_T_SPECIFIER something_bigger_signed
#define JL_PTRDIFF_T_SPECIFIER something-bigger_signed
#endif
#endif
使用方法
size_t a;
printf(JL_SIZE_T_SPECIFIER, a);
printf("The size of a is " JL_SIZE_T_SPECIFIER " bytes", a);
関連
-
[解決済み】C++ 非推奨の文字列定数から「char*」への変換について
-
[解決済み】'cout'は型名ではない
-
[解決済み】C++の変数はイニシャライザーを持っているが、不完全な型?
-
[解決済み】Visual Studio 2013および2015でC++コンパイラーエラーC2280「削除された関数を参照しようとした」が発生する
-
[解決済み】C++ - ステートメントがオーバーロードされた関数のアドレスを解決できない。
-
[解決済み】std::cin.getline( ) vs. std::cin
-
[解決済み】変数やフィールドがvoid宣言されている
-
[解決済み] printf ファミリーを使用して、size_t 変数をポータブルに印刷するにはどうすればよいですか?
-
[解決済み] uint32_t および size_t 用の printf フォーマット指定子
-
[解決済み] printf/String.Formatに相当するJavaScriptの機能
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】構造体のベクター初期化について
-
[解決済み】C++ 非推奨の文字列定数から「char*」への変換について
-
[解決済み】C++ - 解放されるポインタが割り当てられていないエラー
-
[解決済み】変数 '' を抽象型 '' と宣言できない。
-
[解決済み] 既に.objで定義されている-二重包含はない
-
[解決済み】「std::operator」で「operator<<」にマッチするものがない。
-
[解決済み】C++の余分な資格エラー
-
[解決済み】エラー:不完全な型へのメンバーアクセス:前方宣言の
-
[解決済み】Enterキーを押して続行する
-
[解決済み】変数やフィールドがvoid宣言されている