2013-04-20 18 views
7

Die übliche Form der Zeigerdefinitionen Funktion ist:Funktion Pointer Deklaration - was macht __P?

int function(int, int); 
int (*ptr)(int, int); 

aber ich sah heute eine Form, die ich nicht verstand. Kann mir das bitte jemand erklären?

int (*close) __P((struct __db *)); 
+0

Ist das C oder C++? (Fügen Sie das Tag bitte zur Frage hinzu). Weißt du, was das '__P'-Makro ist? – Rup

+1

C, ich habe Tag hinzugefügt. Ich weiß nicht, _P ist Makro. Unser Lehrer bittet uns, die Quelldatei in berkeleyDB zu lernen, aber ich bin nicht gut in C. – Cruisehu

+0

@Maybe Sie sollten eine Antwort akzeptieren –

Antwort

11

Das Makro __P() wird normalerweise verwendet, um C-Implementierungen aus den Tagen K & R C zu unterstützen, wenn es keine Prototypen gab (die mit C89 in C eingeführt wurden). Grundsätzlich ist die Logik

#if SOME_LOGIC_TO_TEST_WHETHER_IMPLEMENTATION_SUPPORTS_PROTOTYPES 
# define __P(argument_list) argument_list 
#else 
# define __P(argument_list)() 
#endif 

Können Sie sehen, wie dies funktioniert, wenn auf Ihr Beispiel angewendet? Beachten Sie, dass für diese zu arbeiten und nicht einen Syntaxfehler verursachen, die Argumentliste die Klammern der Funktionsaufruf, nicht nur die Klammern der funktionsähnliche Makro enthalten muss. Daher die doppelten Klammern, wenn das Makro verwendet wird. Das ist wahrscheinlich der Grund, warum es ungewöhnlich aussieht.

+0

Danke für deine Antwort. Unser Lehrer bittet uns, die Quelldatei in berkeleyDB zu lernen. Ich war gerade in diesem Punkt stecken. Ich bin nicht gut in C. Ich denke, ich sollte mehr über C. lernen. – Cruisehu

+0

@Maybe_hu Es ist eine großartige Sprache, und viel einfacher und eleganter als C++ (das ist nicht ein Superset von C, aber eine völlig andere Sprache, die zufällig etwas Syntax und Geschichte teilt). – Jens

+0

Also für mich, welche Bücher oder Website sollte ich lesen.Können Sie mir etwas empfehlen? – Cruisehu

2

Die übliche Form der Zeigerdefinitionen Funktion ist .... aber ich sah eine Form heute, die ich nicht verstand.

Hier ist nichts besonderes, keine magische Syntax. Dies ist nicht eine andere Form der Funktionszeiger Deklaration.

Dies ist nur die Standardform der Funktionszeigerdeklaration, und __P() ist ein Makro, das von einer der Headerdateien definiert wird, die Sie verwenden. Finden Sie diese Makrodefinition, um zu erfahren, was ihr Zweck ist.

+0

Oder es kann bedingt definiert werden, um entweder sein Argument oder nichts zurückzugeben. Letzteres ist ein Vermächtnis von K & R C, das keine Prototypen hatte. Alte Bibliotheken enthalten immer noch diesen Hack. – Gene

+0

@Gene Ich habe nicht versucht, zu verstehen, was "__P" macht. In der Tat habe ich meine Spekulation entfernt. Der Punkt, den ich versuchte zu machen, ist, dass dies keine alternative Syntax ist. Es ist nur die Standardsyntax und ein Makro. –

9

__P() ist nur ein Makro. Auf meinem System ist definiert als (in sys/cdefs.h) folgt:

#if defined(__STDC__) || defined(__cplusplus) 
#define __P(protos)  protos   /* full-blown ANSI C */ 
#else /* !(__STDC__ || __cplusplus) */ 
#define __P(protos) ()    /* traditional C preprocessor */ 
#endif /* !__GNUC__ */ 

Daraus scheint es verwendet werden, um die Kompatibilität mit (sehr) alten Compiler.

+0

oh! Ich verstehe es. Danke für deine Antwort. – Cruisehu