2013-04-20 20 views
7

La forma usuale di definizioni puntatore a funzione è:Dichiarazione puntatore funzione - cosa fa __P?

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

ma ho visto una forma di oggi, che non ho capito. Qualcuno può spiegarlo per favore?

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

È questo C o C++? (per favore aggiungi il tag alla domanda in entrambi i casi). Sai cosa è la macro '__P'? – Rup

+1

C, ho aggiunto il tag. Non so _P è macro. Il nostro insegnante ci chiede di imparare il file sorgente in berkeleyDB, ma non sono bravo in C. – Cruisehu

+0

@Maybe Dovresti accettare una risposta –

risposta

11

La macro __P() viene in genere utilizzata per supportare le implementazioni C dai giorni di K & R C, quando non erano presenti prototipi (che sono stati introdotti in C con C89). Fondamentalmente la logica è

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

Riesci a vedere come funziona se applicato al tuo esempio? Si noti che per questo lavoro e non causa un errore di sintassi, la lista degli argomenti deve includere le parentesi della funzione chiamata, non solo le parentesi del funzione di simil-macro. Quindi le doppie parentesi quando viene utilizzata la macro. Questa è probabilmente la ragione per cui sembra inusuale.

+0

Grazie per la risposta. Il nostro insegnante ci chiede di imparare il file sorgente in berkeleyDB. Sono rimasto bloccato a quel punto. Non sono bravo in C. Penso che dovrei imparare di più su C. – Cruisehu

+0

@Maybe_hu È un ottimo linguaggio e molto più semplice ed elegante del C++ (che è ** non ** un superset di C, ma un linguaggio completamente diverso che capita di condividere sintassi e cronologia). – Jens

+0

Quindi per me, quali libri o siti Web dovrei leggere. Ne puoi raccomandare qualcuno per me? – Cruisehu

2

La forma usuale di definizioni puntatore a funzione è .... ma ho visto una forma oggi che non ho capito.

Non c'è niente di speciale qui, nessuna sintassi magica. Questo è non un diverso modulo della dichiarazione del puntatore funzione.

Questa è solo la forma standard della dichiarazione del puntatore funzione e __P() è una macro definita da uno dei file di intestazione che si sta utilizzando. Quindi, trova quella definizione di macro per sapere qual è il suo scopo.

+0

Oppure può essere definita in modo condizionale per restituire il suo argomento o nulla. Quest'ultimo caso è un retaggio di K & R C, che non aveva prototipi. Le vecchie librerie contengono ancora questo trucco. – Gene

+0

@Gene Non stavo provando ad entrare in quello che '__P' fa. In effetti ho rimosso la mia speculazione. Il punto che stavo cercando di fare è che questa non è una sintassi alternativa. È solo la sintassi standard e una macro. –

9

__P() è solo una macro. Sul mio sistema è definito come segue (in sys/cdefs.h):

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

Da questo, sembra essere utilizzato per mantenere la compatibilità con (molto) i vecchi compilatori.

+0

oh! Capisco. Grazie per la tua risposta. – Cruisehu