Ответ 1
Ты это сделал. this
- аргумент 1, поэтому, говоря format(printf, 2, 3)
, вы сообщаете компилятору, что вы НЕ печатаете this
, вы печатаете аргумент 2 (fmt
) с дополнительными аргументами, которые были в прошлом.
Я пытаюсь определить метод класса для отладочных отпечатков, которые будут вести себя как 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
не является частью строки, которую я хочу распечатать?
Ты это сделал. this
- аргумент 1, поэтому, говоря format(printf, 2, 3)
, вы сообщаете компилятору, что вы НЕ печатаете this
, вы печатаете аргумент 2 (fmt
) с дополнительными аргументами, которые были в прошлом.
Относитесь к статическим членам так же, как к нечленам. Дискуссия дала мне ответ, но это стоит отметить для других:
Я нашел это, потому что у нас есть некоторые процессы, которые используют такие помощники журналов, как это, и 1 из 4 требовали __attribute__ (( format( printf, 2, 3 ) ))
с тремя другими работами хорошо с __attribute__ (( format(printf, 1, 2) ))
- оказалось, что он нестационар...
Поскольку он работает только для gcc, было бы хорошо определить его таким образом, чтобы избежать ошибок в других компиляторах.
#ifdef __GNUC__
__attribute__ (( format( printf, 2, 3 ) ))
#endif
@Крис Додд прав. Вот последняя документация по gcc для ее резервного копирования (спасибо читателю Foxit за предоставленную мне возможность разметки PDF файлов в Linux). Обратите особое внимание на часть, отмеченную зеленым на изображении ниже.
Поскольку нестатические методы C++ имеют неявный аргумент this, аргументы таких методов следует считать от двух, а не от одного, при задании значений для
string-index
иfirst-to-check
.
Источник: https://gcc.gnu.org/onlinedocs/gcc-8.2.0/gcc/Common-Function-Attributes.html#Common-Function-Attributes (см. Раздел "Формат" (архетип, строковый индекс, сначала -Проверять)").
Изображение (особенно см. Выделение зеленым цветом):