2016-04-22 18 views

Antwort

7

G_GNUC_PRINTF() ist eine glib Bibliothek Präprozessormakro. Für den gcc Compiler wird definiert als (von glib-2.4.5/glib/gmacros.h) folgt:

#define G_GNUC_PRINTF(format_idx, arg_idx) \ 
    __attribute__((__format__ (__printf__, format_idx, arg_idx))) 

Vom gnome documentation:

erweitert sich auf die GNU C Attribut Format-Funktion, wenn der Compiler gcc ist. Dies wird zum Deklarieren von Funktionen verwendet, die eine variable Anzahl von Argumenten mit der gleichen Syntax wie printf() haben. Es ermöglicht dem Compiler, die an die Funktion übergebenen Argumente zu prüfen.

Platzieren Sie das Attribut nach der Funktionsdeklaration direkt vor dem Semikolon.

Parameter:

format_idx: der Index des Arguments der Formatzeichenkette entsprechenden

arg_idx (Die Argumente von 1 numeriert sind): Der Index der ersten von dem Format Argumente

Beispiel 1:

static void ddict_debug(const char* fmt, ...) G_GNUC_PRINTF(1, 2); 
//         | |     | | 
// format string, format_idx = 1 ----+ |   <----+ | 
// format arguments, arg_idx = 2 ---------+   <-------+ 

Beispiel 2:

static void foo_debug(int foo, const char* fmt, ...) G_GNUC_PRINTF(2, 3); 
//       |    | |     | | 
// not a printf argument --+    | |     | | 
// format string, format_idx = 2 -----------+ |   <----+ | 
// format arguments, arg_idx = 3 ----------------+   <-------+ 

Zusammenfassung:

Gibt es nur eine Funktionsdeklaration oder zwei?

Eine printf() - ähnliche Funktion ist definiert. Das Makro weist den Compiler an, die an die Funktion übergebenen Argumente zu prüfen.

+0

Vielen Dank. Das ist genau das, was ich brauche. –

4

Hier ist nur eine Funktion deklariert. Die Deklaration ist static void ddict_debug(const char* fmt, ...);, der G_GNUC_PRINTF(1, 2) Teil ist wahrscheinlich ein Makro, das zu einer Compiler-spezifischen Funktion erweitert wird. Zum Beispiel ist es gcc hat printf wie Funktion des arugments zu validieren, in dem Fall wäre es zu erweitern, um __attribute__ ((format (printf, 1, 2)));

Weitere Einzelheiten finden Sie unter

https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#Common-Function-Attributes

+0

Vielen Dank für Ihre Antwort. –