34

次のように動作するデバッグ プリントのクラス メソッドを定義しようとしていますprintf

inline void debug(const char* fmt, ...) __attribute__ ((format (printf, 1, 2)))

これは次のように不平を言います:

error: format string argument not a string type

クラス メソッドの宣言には暗黙的なパラメーターがあることを思い出したthisので、パラメーターの場所を 2、3 に変更しました。

inline void debug(const char* fmt, ...) __attribute__ ((format (printf, 2, 3)))

thisこれでコンパイルできますが、パラメーターが引数リストの一部として扱われているかのように、パラメーターがシフトされているように見えます。

this出力したい文字列の一部ではない関数をどのように伝えることができますか?

4

4 に答える 4

34

あなたはそれをやった。 thisは引数 1 であるため、 を出力しないformat(printf, 2, 3)ことをコンパイラに伝えていると言うとthis、引数 2 ( fmt) がそれ以降の追加の引数とともに出力されます。

于 2012-07-23T21:53:10.563 に答える
4

静的メンバーを非メンバーと同じように扱います。議論は私に答えを与えましたが、他の人にとっては注目に値します:

  • 非メンバー関数は 1,2 で動作します
  • 静的メンバー関数は 1,2 で動作します
  • 非静的メンバー関数は「this」を #1 として扱うため、2,3 が必要です

これを見つけたのは、このようなログ ヘルパーを使用するプロセスがいくつかあり、4 つのうち 1 つが必要__attribute__ (( format( printf, 2, 3 ) ))であり、他の 3 つがうまく機能し__attribute__ (( format(printf, 1, 2) ))ていることが判明したためです。

于 2015-12-16T16:19:52.653 に答える
2

@クリス・ドッドは正しいです。これをバックアップするための最新の gcc ドキュメントを次に示します ( Linux で PDF をマークアップさせてくれたFoxit リーダーに感謝します)。下の画像の緑の部分に注目してください。

非静的 C++ メソッドには暗黙の this 引数があるため、そのようなメソッドの引数は、と の値を指定するときに 1 つではなく2 つstring-indexからカウントする必要がありfirst-to-checkます。

ソース: https://gcc.gnu.org/onlinedocs/gcc-8.2.0/gcc/Common-Function-Attributes.html#Common-Function-Attributes (「フォーマット (アーキタイプ、文字列インデックス、最初の-チェックする)")。

画像(特に緑色のハイライトを参照):

ここに画像の説明を入力

于 2019-01-15T01:16:25.497 に答える