В чем разница между -std = c ++ 11 и -std = gnu ++ 11?

132

Каковы различия между -std=c++11и в -std=gnu++11качестве параметра компиляции для GCC и звона? Тот же вопрос с c99и gnu99? Я знаю о стандартах C ++ и C, меня интересуют различия в параметрах.

Я где-то читал, что это связано с некоторыми расширениями, но мне непонятно, какие из них и как выбрать между тем или другим для нового проекта.

Klaim
источник
5
Те gnuдействительно относятся к расширениям, и если вы хотите написать переносимый код, вам следует придерживаться стандарта и вообще избегать расширений.
juanchopanza

Ответы:

91

Как вы сами выяснили, разница между двумя вариантами заключается в том, включены ли расширения GNU, которые нарушают / расширяют стандарт C ++, или нет. Расширения GNU C ++ описаны здесь . Вы также можете использовать большинство расширений GNU C (описанных здесь ) в своих программах на C ++. Было бы также полезно прочитать о -Wpedanticопции GCC здесь .

Обратите внимание, что некоторые расширения могут действовать при использовании -std=c++11, если они не противоречат стандарту. Например, при использовании компилятора MinGW мне нужны расширения для рабочего Boost.Lexical_Cast. Но пока вы не используете ни один из них, вам лучше придерживаться стандарта без расширений для максимальной переносимости. Это может пригодиться, если вам придется сменить компилятор.

daramarak
источник
4
Да, я избегаю расширений, потому что я не рекомендую делать что-либо, что специально не определено в Стандарте ... но даже тогда «нарушает» - странный и загруженный термин, когда многие из этих расширений используют Standardese , просто определение реализации или указание вещей, о которых стандарт не говорит, - или, возможно, даже всех расширений ... Есть ли у вас ссылка на какое-либо расширение GNU, которое нарушает стандарт, делая что-то отличное от того, что явно определяет стандарт?
underscore_d
9
Хотя этот ответ является хорошим общим, не могли бы вы отредактировать его, чтобы хотя бы перечислить расширения, которые включены, gnu11но не включены c++11? Список, на который вы ссылаетесь, содержит все расширения, и, как вы сами указываете, некоторые из них также включены c++11(например, __restrict__).
einpoklum
То, что я обнаружил сейчас, и никогда бы не сделал вывод, просматривая документацию по флагам, следующее: -std = c ++ 11 повторно включает триграфы -std = gnu ++ 11 игнорирует их и выдает предупреждение, подобное ему делает, если полностью опустить -std
Daniel82