27 votes

Gnu C ++ macro __cplusplus standard conforme?

Le compilateur C++ de Gnu semble définir __cplusplus être 1

#include <iostream> 
int main() {
  std::cout << __cplusplus << std::endl;
}

Ce imprime 1 avec gcc c++ standard mode, ainsi que dans C++0x mode, avec gcc 4.3.4, et gcc 4.7.0.

Le C++11 FDIS dit dans "de 16,8 macro Prédéfinie noms [rpc.prédéfini]" que

Le nom de l' __cplusplus est défini à la valeur 201103L lors de la compilation en C++ de l'unité de traduction. (Note de bas de page: Il est prévu que les futures versions de cette norme remplacera la valeur de cette macro avec une plus grande valeur. Non-conformes à la com- pilers devez utiliser une valeur avec au plus cinq chiffres après la virgule.)

L'ancien std C++03 avait une règle similaire.

Est la GCC deliberatly cette définition 1, parce qu'il est "non conforme"?

En lisant cette liste, j'ai pensé que je pourrais utiliser __cplusplus de vérifier de façon portable si j'ai un C++11 activé compilateur. Mais avec g++ , cela ne semble pas fonctionner. Je sais à propos de l' ...EXPERIMENTAL... macro, mais j'étais curieux de savoir pourquoi g++ est la définition de la __cplusplus de cette façon.

Mon premier problème a été de basculer entre les différents pointeur null-variantes. Quelque chose comme ceci:

#if __cplusplus > 201100L
#  define MYNULL nullptr
#else
#  define MYNULL NULL
#endif

Est-il simple et raisonnablement portable façon de mettre en œuvre un tel changement?

25voto

Kusalananda Points 1683

Cela a été corrigé il y a environ un mois (pour gcc 4.7.0). Le rapport de bogue fait une lecture intéressante: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=1773

0voto

C'est un très vieux bogue g ++.

Autrement dit, le compilateur n'est pas conforme.

Apparemment, il ne peut pas être réparé car le réparer casserait quelque chose sur une plate-forme folle.

EDIT : oh, je vois dans le commentaire de @ birryree qui vient d'être corrigé, dans la version 4.7.0. Il n'était donc pas impossible de réparer après tout. Il h.

Santé et hth.

0voto

wilhelmtell Points 25504

Si je me souviens bien, cela a à voir avec Solaris 8 provoquant des problèmes lorsque __cplusplus est défini comme il se doit. L'équipe gcc a décidé à l'époque de prendre en charge la plate-forme Solaris 8 plutôt que de se conformer à cette clause particulière. Mais j'ai remarqué que la dernière version de gcc met fin à la prise en charge de Solaris 8, et je suppose que c'est un premier pas dans la bonne direction.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X