2010-11-10 4 views
3

Le titre de la question devrait tout dire, mais voici un exemple de ce genre de chose que je cherche:Comment vérifier (via le préprocesseur) si un fichier source C est compilé en C++ Code

#ifndef THE_IDENTIFIER_THAT_WOULD_INDICATE_BEING_COMPILED_AS_CPLUSPLUS 

/* 
* Example of something that would matter. 
*/ 
typedef enum _bool bool; 
enum _bool { false, true }; 

#endif 

Quel est l'identifiant? Cela m'inquiète sévèrement, car je sais que j'ai vu du code qui le fait avant. J'utilise GCC, d'ailleurs.

(je suis surpris que je ne pouvais pas trouver un doublon quelque part sur le SO. Si quelqu'un peut trouver autre un, ne hésitez pas à me réorienter et fermer cette dupe.)

+3

Il est '__cplusplus'. La macro est définie par les compilateurs C++. Dupliqué de: http://stackoverflow.com/questions/3858308/using-c-preprocessor-to-determine-compilation-environment – birryree

+1

btw: C99 a ajouté un type booléen natif appelé '_Bool', aliasé' bool' si vous incluez '' – Christoph

+0

Voir aussi [Directive du préprocesseur pour tester s'il s'agit d'un C ou C++] (http://stackoverflow.com/questions/12548490/preprocessor-directive-to-test-if-this-is-c-or-c) pour en apprendre plus sur 'extern 'C" 'et quelques façons de gérer. –

Répondre

10
#ifndef __cplusplus 

Si je me souviens correctement.

+0

il est généralement utilisé dans les gardes de fichier d'en-tête #ifdef __cplusplus \ n extern "C" {\ n # endif – Petesh

+1

+1 Vous vous souvenez correctement. Devrait être #ifndef pour ce que William veut. –

+0

Merci. J'ai édité ma réponse. – frast

2

#ifdef __cplusplus

avec quelques compilateurs vraiment anciennes (les premières versions de cfront et deux ports), il était c_pluplus, IIRC.

1

L'identifiant que vous recherchez est __cplusplus, qui peut être utilisé comme ceci:

#ifdef __cplusplus 
// Code being compiled as C++. 
#endif 
1

#ifdef __cplusplus

Je pense que l'extension du fichier est important aussi, si le compilateur C++ est donné une Fichier .c il le compilera en tant que code C. Je n'ai rien pour le sauvegarder cependant.

4

L'identifiant est __cplusplus

#ifdef __cplusplus 
#error NO C++ PLEASE 
#endif 
+3

+1 pour une utilisation optimale de '__cplusplus'. –

Questions connexes