-ansi
- це застарілий комутатор, який вимагає від компілятора скласти відповідно до 30-річної застарілої редакції стандарту C , ISO / IEC 9899: 1990 , що по суті є ребрендингом стандарту ANSI X3.159-1989 "Мова програмування C" . Чому застарілий? Оскільки після опублікування C90 ISO був ISO, відповідав за стандартизацію С., а будь-які технічні виправлення до C90 були опубліковані ISO, тому більш доцільним є використання -std=c90
.
Без цього перемикання останні компілятори GCC C відповідатимуть мові C, стандартизованій в ISO / IEC 9899: 2011 , або новітній версії 2018 року.
На жаль, є кілька ледачих постачальників компіляторів, які вважають, що прийнятно дотримуватися старішої застарілої стандартної редакції, для якої стандартний документ навіть не доступний у стандартних органах.
Використання комутатора допомагає забезпечити компіляцію коду в цих застарілих компіляторах.
-pedantic
Є цікавим. За відсутності -pedantic
, навіть коли вимагається конкретний стандарт, GCC все одно дозволить розширити деякі розширення, неприйнятні для стандарту C. Розглянемо для прикладу програму
struct test {
int zero_size_array[0];
};
C11 проект n1570 пункту 6.7.6.2p1 каже :
Окрім необов'язкових класифікаторів типу та ключового слова статичний, [і] може розмежувати вираз або *. Якщо вони розмежовують вираз (який визначає розмір масиву), вираз має цілий тип. Якщо вираз є постійним виразом, він повинен мати значення, що перевищує нуль. [...]
Стандарт C вимагає, щоб довжина масиву була більше нуля; і цей пункт є обмеженням ; стандарт говорить наступне 5.1.1.3p1 :
Відповідна реалізація повинна створювати щонайменше одне діагностичне повідомлення (ідентифіковане визначеним способом, визначеним реалізацією), якщо блок попереднього переробки або блок перекладу містить порушення будь-якого синтаксичного правила або обмеження, навіть якщо поведінка також явно визначена як невизначена або визначений. Діагностичні повідомлення не потрібно видавати за інших обставин.9)
Однак якщо ви компілюєте програму gcc -c -std=c90 pedantic_test.c
, попередження не видається.
-pedantic
змушує компілятор фактично відповідати стандарту C ; тож тепер він виробляє діагностичне повідомлення, як того вимагає стандарт:
gcc -c -pedantic -std=c90 pedantic_test.c
pedantic_test.c:2:9: warning: ISO C forbids zero-size array ‘zero_size_array’ [-Wpedantic]
int zero_size_array[0];
^~~~~~~~~~~~~~~
Таким чином, для максимальної портативності, уточнення стандартної редакції недостатньо, ви також повинні використовувати -pedantic
(або -pedantic-errors
), щоб переконатися, що GCC насправді відповідає букві стандарту.
Остання частина питання була про використання -ansi
з C ++ . ANSI ніколи не стандартизував мову C ++ - лише перейнявши її з ISO, тому це має стільки ж сенсу, як говорити "Англійська, як стандартизована Францією". Однак GCC все ще, здається, сприймає це для C ++, як не дурно звучить.