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

132

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

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

Klaim
la source
5
Les gnuceux ne se réfèrent à des extensions, et si vous voulez écrire du code portable , vous devriez en tenir à des extensions standard et éviter complètement.
juanchopanza

Réponses:

91

Comme vous l'avez découvert vous-même, la différence entre les deux options est de savoir si les extensions GNU qui violent / étendent le standard C ++ sont activées ou non. Les extensions GNU C ++ sont décrites ici . Vous pouvez également utiliser la plupart des extensions GNU C (décrites ici ) dans vos programmes C ++. Il serait également utile de lire sur l' -Wpedanticoption GCC ici .

Notez que certaines extensions peuvent toujours être en vigueur lors de l'utilisation -std=c++11, tant qu'elles ne contredisent pas la norme. Par exemple, lorsque j'utilise le compilateur MinGW, j'ai besoin des extensions pour fonctionner Boost.Lexical_Cast. Mais, tant que vous n'en utilisez aucun, vous feriez mieux de vous en tenir à la norme sans extensions pour une portabilité maximale. Cela peut être utile si vous vous trouvez obligé de changer de compilateur.

Daramarak
la source
4
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 le Standard ... mais même dans ce cas, «viole» est un terme étrange et chargé, quand beaucoup de ces extensions le sont, pour utiliser Standardese , juste la définition de l'implémentation ou la spécification de choses sur lesquelles le Standard est silencieux - ou peut-être même toutes les extensions ... Avez-vous une citation pour toute extension GNU qui viole le Standard en faisant quelque chose de différent de ce que le Standard définit explicitement?
underscore_d
9
Bien que cette réponse soit une bonne réponse générale, envisageriez-vous de la modifier de manière à au moins répertorier les extensions qui sont activées gnu11mais pas dans c++11? La liste à laquelle vous avez lié est de toutes les extensions, et comme vous l'indiquez vous-même, certaines d'entre elles sont également activées c++11(comme __restrict__).
einpoklum
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 ça fait en omettant -std alltogether
Daniel82