2012-07-23 9 views
14

Ich versuche, eine Klassenmethode für Debug-Ausdrucke zu definieren, die verhalten sich wie printf:Wie soll ich __attribute__ ((format (printf, x, y))) innerhalb einer Klassenmethode in C++ verwenden?

error: format string argument not a string type 

ich daran erinnert, dass eine Klassenmethode Deklaration hat einen impliziten this Parameter: über

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

Dies beklagt , so änderte ich die Positionen der Parameter zu 2, 3:

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

und jetzt kompiliert es, aber es sieht so aus, als wären die Parameter verschoben, als ob der this Parameter als Teil der Argumentliste behandelt würde.

Wie kann ich der Funktion mitteilen, dass this nicht Teil der Zeichenfolge ist, die ich drucken möchte?

+0

Können Sie variadic Vorlagen verwenden? Wenn ja, kannst du einen [type safe printf] schreiben (http://www.generic-programming.org/~dgregor/cpp/variadic-templates.html) – chris

+1

Denke nicht zu viel über "das" nach. Es ist kein explizites Argument, Punkt. Folgen Sie einfach dem GCC-Handbuch, das besagt, dass Sie für Elementfunktionen 1 zu den 'format'-Attributargumenten hinzufügen müssen. Es ist nur eine undurchsichtige Regel, die Ihnen vom Hersteller einer Compiler-Erweiterung gegeben wird. –

+2

printf (2, 3) ist richtig. Definieren Sie "scheint wie verschoben" ...? –

Antwort

15

Sie haben es getan. this ist Argument 1, also sagen Sie format(printf, 2, 3), dass Sie dem Compiler sagen, dass Sie NICHT this drucken, Sie drucken Argument 2 (fmt) mit zusätzlichen Argumenten darüber hinaus.

+0

Es macht Sinn, aber ich frage mich, warum das nirgendwo dokumentiert ist – dashesy

+1

@dashesy: ​​es ist in der GCC-Info-Seite für das 'Format' Attribut dokumentiert ... –

+1

Sie haben Recht [hier] (https: //gcc.gnu. org/onlinedocs/gcc/Allgemeine Funktionsattribute.html # Common-Function-Attribute): ** Da nicht-statische C++ - Methoden ein implizites Argument haben, sollten die Argumente solcher Methoden bei der Angabe von Werten für String-Index und First-to-Check von zwei, nicht von eins gezählt werden . ** – dashesy

2

Da es nur für gcc funktioniert, wäre es gut, es so zu definieren, um Fehler bei anderen Compilern zu vermeiden.

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

Das ist ein guter Punkt im Allgemeinen, aber es ist kein Problem für mich, da dies eine interne Codebasis ist, die unter Verwendung eines strikten Ablaufs erstellt wurde. –

+3

Sie können auch '#ifndef __GNUC__ #define __attribute __ (a)' verwenden. Dann können Sie jedes Attribut verwenden. – cubuspl42

2

Behandeln Sie statische Elemente wie Nichtmitglieder. Die Diskussion gab mir die Antwort, aber es ist erwähnenswert, für andere:

  • Dritt Funktionen arbeiten mit 1,2
  • statischen Member-Funktionen arbeiten mit 1,2
  • nicht-statischen Mitgliederfunktionen behandeln ‚this‘ als # 1, müssen so 2,3

ich das gefunden, weil wir einige Prozesse, die Log-Helfer wie diese verwenden und 1 von 4 wurde __attribute__ ((format(printf, 2, 3))) mit dem anderen thr erfordern ee funktioniert gut mit __attribute__ ((format(printf, 1, 2))) - stellte sich heraus, es war nicht-statisch ...

Verwandte Themen