2012-09-22 15 views
13

Possible Duplicate:
How to check (via the preprocessor) if a C source file is being compiled as C++ codeCome si scrive un file di intestazione C che può essere utilizzato nei programmi C++?

che sto cercando di trovare una macro standard che metterà alla prova se un file di intestazione viene compilato come C o C++. Lo scopo di questo è che l'intestazione può essere inclusa dal codice C o C++ e deve comportarsi in modo leggermente diverso a seconda di quale. In particolare:

In C, ho bisogno che questo è il codice:

extern size_t insert (const char*); 

In C++, ho bisogno di questo di essere il codice:

extern "C" size_t insert (const char*); 

Inoltre, c'è un modo per evitare mettendo # ifdef intorno a ogni dichiarazione nell'intestazione?

+1

Potrei essere di parte, ma direi che questa domanda ha a che fare anche con extern. Poiché non conoscevo la sintassi "extern {...}" in precedenza, la mia risposta selezionata è molto più utile di quella fornita nel duplicato proposto. Modificherò la domanda per mostrare questa differenza. – Collin

+0

Ho lasciato un x-ref a questa domanda sul duplicato proposto. Potresti migliorare la distinzione tra i due con un titolo rivisto come "Come definire condizionalmente" extern "C" 'o semplicemente" extern "che rileva automaticamente il compilatore C o C++?" O qualcosa del genere lungo queste linee generali. –

+0

@JonathanLeffler Ho modificato il titolo per riflettere ciò che (penso) viene realmente chiesto, come illustrato dall'esempio nel testo ... la ricerca di questo, tuttavia, ha rivelato un titolo duplicato: http://stackoverflow.com/ domande/8742534/incluso-c-header-in-c-file ... ma non duplicare il contenuto –

risposta

27

È normale suddividere i file di intestazione C come segue in modo che possano essere utilizzati nei programmi C++. Verificare i file di intestazione di sistema come stdio.h e probabilmente vedrete questo:

#ifdef __cplusplus 
extern "C" { 
#endif 

... 

#ifdef __cplusplus 
} 
#endif 
15

La risposta è utilizzare la macro __cplusplus. In questo caso, l'approccio più semplice è:

extern 
#ifdef __cplusplus 
"C" 
#endif 
size_t insert (const char*); 

Questa macro fa parte dello standard C++.

+4

E se vuoi farlo per più funzioni, la norma è '#ifdef __cplusplus extern" C "{# endif' ...' #ifdef __cplusplus} # endif'. – chris

+4

Un'altra possibilità: '#ifdef __cplusplus' ...' #define EXTERN extern "C" '...' # else' ... '#define EXTERN extern' ...' # endif' (dove ...denota una nuova riga) –

+0

g ++ non piace #define EXTERN extern "C" esso vini così: errore previsto qualificato-id prima costante stringa – user1656671

7

Potreste trovare ragionevole definire tre macro per aiutare con questo:

#ifdef __cplusplus 
#define EXTERN_C_BEGIN extern "C" { 
#define EXTERN_C_END } 
#define EXTERN_C  extern "C" 
#else 
#define EXTERN_C_BEGIN /* Nothing */ 
#define EXTERN_C_END /* Nothing */ 
#define EXTERN_C  extern /* Or Nothing */ 
#endif /* __cplusplus */ 

Questo sarebbe molto utile in un'intestazione standard inclusa nella maggior parte dei luoghi del progetto. Per una singola funzione, si potrebbe scrivere:

EXTERN_C size_t insert(const char *name); 

Per un gruppo di funzioni, si potrebbe scrivere:

EXTERN_C_BEGIN 

size_t other_insert(const char *name); 
size_t other_delete(const char *name); 
size_t other_update(const char *old_name, const char *new_name); 

EXTERN_C_END 

È consentito includere extern di fronte alle singole funzioni all'interno del EXTERN_C_BEGIN a EXTERN_C_END bloccare.

Problemi correlati