How should I properly use __attribute__ ((format (printf, x, y))) inside a class method in C++?

Viewed 27097

I'm trying to define a class method for debug prints that will behave like printf:

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

This complains about:

error: format string argument not a string type

I recalled that a class method declaration has an implicit this parameter, so I changed the locations of the parameters to 2, 3:

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

and now it compiles, but it looks like the parameters are shifted, as if the this parameter were being treated as part of the argument list.

How can I tell the function that this isn't part of the string that I want to print?

4 Answers

@Chris Dodd is correct. Here's the latest gcc documentation to back it up (thanks Foxit reader for letting me mark up PDFs on Linux). Pay special attention to the part marked in green in the image below.

Since non-static C++ methods have an implicit this argument, the arguments of such methods should be counted from two, not one, when giving values for string-index and first-to-check.

Source: https://gcc.gnu.org/onlinedocs/gcc-8.2.0/gcc/Common-Function-Attributes.html#Common-Function-Attributes (see the section titled "format (archetype, string-index, first-to-check)").

Image (esp. see highlighting in green):

enter image description here

Related