152 votes

Quelles sont les différences entre -std=c++11 et -std=gnu++11 ?

Quelles sont les différences entre -std=c++11 et -std=gnu++11 comme paramètre de compilation pour gcc et clang ? Même question avec c99 et gnu99 ? Je connais les normes C++ et C, ce sont les différences dans les paramètres qui m'intéressent.

J'ai lu quelque part que cela avait à voir avec certaines extensions, mais je ne sais pas exactement lesquelles ni comment choisir l'une ou l'autre pour un nouveau projet.

7 votes

Le site gnu Certains font référence à des extensions, et si vous voulez écrire du code portable, vous devriez vous en tenir à une norme et éviter complètement les extensions.

101voto

daramarak Points 3662

Comme vous l'avez constaté vous-même, la différence entre les deux options est l'activation ou non des extensions GNU qui violent/étendent le standard C++. Les extensions GNU C++ sont décrites ici . Vous pouvez également utiliser la plupart des extensions GNU C (décrites dans la section ici ) dans vos programmes C++. Il serait également utile de se renseigner sur le -Wpedantic Option GCC ici .

Notez que certaines extensions peuvent encore être en vigueur lors de l'utilisation de l'option -std=c++11 pour autant qu'elles ne soient pas en contradiction avec la norme. Par exemple, lorsque j'utilise le compilateur MinGW, j'ai besoin des extensions pour que le système fonctionne. Boost.Lexical_Cast . Mais, tant que vous n'utilisez aucune d'entre elles, il est préférable de s'en tenir au standard sans extensions pour une portabilité maximale. Cela peut s'avérer utile si vous êtes obligé de changer de compilateur.

4 votes

Oui, j'évite les extensions parce que je ne recommande pas de faire quoi que ce soit qui ne soit pas spécifiquement défini par la norme... mais même dans ce cas, "viole" est un terme étrange et chargé, quand beaucoup de ces extensions sont, pour utiliser le langage standard, juste définissant l'implémentation ou spécifiant les choses sur lesquelles la norme est silencieuse - ou peut-être même toutes les extensions... Avez-vous une citation pour une extension GNU qui viole le standard en faisant quelque chose de différent d'une chose que le standard définit explicitement ?

10 votes

Bien que cette réponse soit une bonne réponse générale, pourriez-vous envisager de l'éditer afin de lister au moins les extensions qui sont activées en gnu11 mais pas dans c++11 ? La liste dont vous avez donné le lien est celle de toutes les extensions, et comme vous l'indiquez vous-même, certaines d'entre elles sont activées par le biais de la fonction c++11 également (comme __restrict__ ).

0 votes

Ce que j'ai découvert maintenant, et que je n'aurais jamais conclu en regardant la documentation des drapeaux, est le suivant : -std=c++11 réactive les trigraphes -std=gnu++11 les ignore et émet un avertissement, comme il le fait en omettant complètement -std.

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