Які відмінності між -std = c ++ 11 і -std = gnu ++ 11?


132

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

Я десь читав, що це стосується деяких розширень, але мені незрозуміло, які з них і як вибрати для того чи іншого проекту новий проект.


5
Вони gnuстосуються розширень, і якщо ви хочете написати портативний код, вам слід дотримуватися стандарту і взагалі уникати розширень.
juanchopanza

Відповіді:


91

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

Зауважте, що деякі розширення можуть бути чинними при використанні -std=c++11, якщо вони не суперечать стандарту. Наприклад, при використанні компілятора MinGW мені потрібні розширення для робочого Boost.Lexical_Cast. Але поки ви не використовуєте жоден із них, вам краще дотримуватися стандарту без розширень для максимальної мобільності. Це може стати в нагоді, якщо ви змушені змінити компілятор.


4
Так, я уникаю розширень, тому що я не рекомендую робити щось, що конкретно не визначено Стандартом ... але навіть тоді "порушує" - це дивний і завантажений термін, коли багато цих розширень є, щоб використовувати Standardese , просто визначення або вказівка речей, про які Стандарт мовчить, або, можливо, навіть усі розширення ... Чи є у вас цитування будь-якого розширення GNU, яке порушує Стандарт, роблячи щось відмінне від того, що Стандарт явно визначає?
підкреслюй_d

9
Хоча ця відповідь є хорошою загальною, чи можете ви відредагувати її так, щоб принаймні перелічити розширення, увімкнені, gnu11але не в c++11? Список, до якого ви пов’язані, має всі розширення, і як ви самі вказуєте, деякі з них також увімкнено c++11(як __restrict__).
einpoklum

Те, що я дізнався зараз, і ніколи б не зробив висновок, переглянувши документацію прапорів, це таке: -std = c ++ 11 повторно вмикає триграфи -std = gnu ++ 11 ігнорує їх і видає попередження, як це робить, якщо пропустити -std взагалі
Daniel82
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.