2009-07-27 15 views
0

(cas de plus compter sur un IDE)étrange Eclipse C++ Comportement #define

J'ai un code héritage C que je compile en C++ dans le but des tests unitaires. La source C est au courant de C++ en ce qu'elle conditionne basé sur l'environnement.

E.g. (PRIVATE décide de static):

#if!defined __cplusplus 
#define PRIVATE1 PRIVATE 
#endif 

...

PRIVATE1 const int some_var; 

Le problème est que je ne peux pas sembler juste pour savoir ce que PRIVATE1 décide ou est en C++, le compilateur se plaint de redéfinition si j'ajoute une déclaration mais n'indique pas où?

J'ai recherché mon chemin d'inclusion MinGW/gcc, la spécification ISO C++ et les livres C++ disponibles pour moi ont été en vain.

Edit:

Bien sûr, je vérifié la ligne de commande et makefiles avant de poster.

+0

Vous devriez répondre à votre propre question et ensuite accepter votre réponse. Cela a deux avantages: d'abord, il est clair que pour les lecteurs plus tard il y avait une réponse acceptée; et deux, il vous permet d'obtenir une certaine réputation pour résoudre votre problème ... – RBerteig

+0

@RBerteig - Point pris et répondu de la bonne manière. Merci. – Oliver

Répondre

2

Les projets gérés Eclipse C++ sont un peu, bien stupides!

Si un projet est déclaré C++, il base toujours son build sur l'extension de fichier, par conséquent.h fichier prétraité en tant que C et C++ non-tête qui tire dans un PRIVATE1 #define d'un autre fichier d'en-tête est similaire enveloppé par:

#ifdef __cpluplus. 

Le projet est alors lié par g ++.

4

Si PRIVATE1 décide de PRIVATE et PRIVATE décide de static, puis PRIVATE1 décide de static.

+0

Impossible de battre cette logique ... :-) –

+3

Vous avez manqué le fait que cette définition est dans le bloc '#if! __ cplusplus'. C'est à dire. il ne fonctionne pas pour un compilateur C++, mais ce dernier détermine d'une manière ou d'une autre ce que 'PRIVATE' est - donc la question est de savoir comment cela fonctionne. –

5

Il n'y a rien de tel dans les spécifications ISO C++. Très probablement, PRIVATE1 (ainsi que PRIVATE) sont définis ailleurs dans le projet. Notez que ceci n'a pas besoin d'être un #define dans un fichier .h - il peut également être défini via les commutateurs du compilateur dans le fichier makefile. Je suggère de faire un grep complet sur le répertoire du projet.

+0

"la spécification ISO C++ et les livres C++ disponibles pour moi ont été en vain." – Oliver

2

Il est peu probable (mais pas impossible) qu'ils soient définis par MinGW lui-même. Les macros définies par l'implémentation C++ ou C doivent commencer par un trait de soulignement.

0

Très probablement en C++, il est défini à, bien, "private:".

+0

Mosdt probablement pas, car le code de l'OP se développerait alors à une erreur de syntaxe. –

+0

Désolé, je voulais dire "privé:" qui serait valide –

+0

Ensuite, il aurait besoin de faire partie d'une classe. Comme il est compilable en C et C++, il ne fait probablement pas partie d'une classe. –

1

Votre meilleur pari est de regarder la sortie du préprocesseur. Vous n'avez pas publié le compilateur que vous utilisez, mais si vous vérifiez les docs, la plupart ont une option "Preprocess to file" qui créera un fichier avec toutes les macros substituées. Cela pourrait vous aider à comprendre ce qui se passe. Dans Visual Studio, vous utilisez l'option/E (sous C/C++ -> Préprocesseur -> Générer un fichier prétraité) qui transformera foo.c en foo.i. Ce fichier sera généralement énorme par rapport au fichier source d'origine, alors faites défiler vers le bas pour voir votre code.

0

Pouvez-vous déclarer une fonction avec PRIVATE1? Si c'est le cas, écrivez simplement une fonction comme ceci:

PRIVATE1 void Foo() { 
    // __FUNCSIG__ in Visual Studio, not sure about GCC 
    std::cout << __FUNCSIG__ << std::endl; 
}