#ifdef fa parte dello standard, #if defined no. Il vantaggio di #if defined è che puoi fare cose del tipo:
codice:
#if defined(PIPPO) && defined(PLUTO)
// andiamo a topolinia
#endif
al posto di:
codice:
#ifdef PIPPO
#ifdef PLUTO
// andiamo a topolinia
#endif
#endif
ma in genere non è portabile.
Il giochino del:
codice:
#ifdef __cplusplus
extern "C" {
#endif
si applica ad header che possono essere inclusi sia in C che in C++. Praticamente quando e' incluso in un file C++ si dice al compilatore: hey guarda che quello che c'e' scritto nel blocco extern "C" deve essere capito anche da un eventuale includente in C.