Подтвердить что ты не робот

Как правильно использовать __attribute__ ((format (printf, x, y))) внутри метода класса в С++?

Я пытаюсь определить метод класса для отладочных отпечатков, которые будут вести себя как 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 не является частью строки, которую я хочу распечатать?

4b9b3361

Ответ 1

Ты это сделал. this - аргумент 1, поэтому, говоря format(printf, 2, 3), вы сообщаете компилятору, что вы НЕ печатаете this, вы печатаете аргумент 2 (fmt) с дополнительными аргументами, которые были в прошлом.

Ответ 2

Относитесь к статическим членам так же, как к нечленам. Дискуссия дала мне ответ, но это стоит отметить для других:

  • Функции нечлена работают с 1,2
  • static функции-члены работают с 1,2
  • нестатические функции-члены рассматривают 'this' как # 1, поэтому нужно 2,3

Я нашел это, потому что у нас есть некоторые процессы, которые используют такие помощники журналов, как это, и 1 из 4 требовали __attribute__ (( format( printf, 2, 3 ) )) с тремя другими работами хорошо с __attribute__ (( format(printf, 1, 2) )) - оказалось, что он нестационар...

Ответ 3

Поскольку он работает только для gcc, было бы хорошо определить его таким образом, чтобы избежать ошибок в других компиляторах.

#ifdef __GNUC__
          __attribute__ (( format( printf, 2, 3 ) ))
#endif

Ответ 4

@Крис Додд прав. Вот последняя документация по 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 (см. Раздел "Формат" (архетип, строковый индекс, сначала -Проверять)").

Изображение (особенно см. Выделение зеленым цветом):

enter image description here