Я так понимаю, это «нововведение» в новом стандарте C. gcc тут при чём? Только при том, что он реализует новый стандарт? Если это некорректная программа, зачем её компилировать.
Ну и как обходить - уже сказали, надо просто указать старый стандарт.
Ты наверное не так понял. Вот есть у меня c99 код, я ansi не могу указать, слишком старый стандарт, код не компилируется, все что новее тоже, потому что implicit function declaration!
Ради одной опции, которая раньше нормально работала? Это неадекватное решение со стороны разработчиков gcc. Причем старый gcc даже теперь новым не собрать, он сам имеет кучу таких ошибок.
Надо ли говорить что это сделал человек из RH судя по коммитам? Я вот сразу догадался.
Если у тебя есть «старая» либа, ее компилишь с ansi.
Свой «новый» код с c99. Единственное проблемное место может быть с инклудом «старых» хидеров в «новый» код. Но в этом случае есть специально обученные опции для путей, где искать такие хидера. При указании таких опций компилятор, вроде как, ворнинги перестает выдавать для этих хидеров. Но я это уже плохо помню. Такое настраивается один раз и забывается до следующего проекта) Смотри на isystem или что-то похожее. Что будет в этом случае надо будет смотреть.
При -std=c99 implicit-declaration является неотключаемой ошибкой, он НЕ компилируется. Код которому нужен c99 я назвал старым в оригинальном посте. Например gtk2 уже не поддерживается.
Единственное проблемное место может быть с инклудом «старых» хидеров в «новый» код.
Наоборот тоже бывает. Раньше библиотека требовала только c89, потом стала c99.
Почему оно влияет на -std=c99 которому уже 25 лет?
Потому, что в этом стандарте это уже был невалидный код. Правильный вопрос должен быть - почему 25 лет они этого не делали?
Это проблема компилятора, если стандарт неадекватный, должен быть путь обхода.
Не проблема и не должен. Если твой код не соответствует никакому стандарту, это проблема только твоего кода. Продолжать держать баги в компиляторе только чтобы ты его не переписывал - это неправильно.
Программы которыми я пользовался больше не собираются, это очень понятно и объективно. Так что это плохое решение со стороны gcc, и я буду так считать.
Если твой код не соответствует никакому стандарту
Задача стандарта описывать язык на котором пишут программы, у него получилось плохо.
implicit-function-declaration неотключаемая ошибка. Как собирать старый код?
Это код не то, что старый, а протухший, его переписывать надо, а не собирать.
У меня так брат умер Я на 5 курсе неделю угрохал, пытаясь заставить работать свою первую числодробилку на Си, притом, что прототип этой программы на Паскале я написал и отладил за вечер. А если бы такие штуки были запрещены, программа бы просто не собралась. Там, конечно, одно на другое наложилось: и опечатка в справочнике, из-за которой я не тот инклуд написал, и препроцессорные костыли вместо модульностей, и вот эта вот возможность вызывать необъявленную функцию, и то, что функция фигурировала только в критерии завершения итераций, ни на какие переменные в самой программе не влияя. Наложение всего перечисленного дало просто феерический результат.
Это код не то, что старый, а протухший, его переписывать надо, а не собирать.
А может сразу компилятор С выкинуть? Пусть на Rust переписывают. Предлагаю завтра в едином порыве удалить со всех машин устаревший и ужасный gcc (gcc-rust оставим).
У gcc нововведения еще хуже, implicit-function-declaration неотключаемая ошибка. Как собирать старый код?
Почему оно влияет на -std=c99 которому уже 25 лет?
Мне c99 нужен.
А зачем он тебе нужен, если ты его не знаешь?
ISO/IEC 9899:TC3 Committee Draft — Septermber 7, 2007 WG14/N1256
This second edition cancels and replaces the first edition, ISO/IEC 9899:1990, as
amended and corrected by ISO/IEC 9899/COR1:1994, ISO/IEC 9899/AMD1:1995, and
ISO/IEC 9899/COR2:1996. Major changes from the previous edition include:
— ...
— remove implicit int
— ...
— remove implicit function declaration
GCC в таком случае не проще закопать? Они там и дальше будут совместимость ломать. Мне кажется тут либо собирать все с совместимой версией GCC, либо использовать другой компилятор.
То есть берутся старые программы(не его), происходит попытка собрать их с новой версией компилятора и фейл.
Ну в общем-то это норма. Я вот щас пишу фирмварь, там gcc 9. В поздних версиях ошибка в SDK производителя, как минимум в одном месте. Я, конечно, могу поправить, но зачем? SDK производителя тестировался с 9, ну и пускай будет она.
Версия компилятора это такая же фиксированная часть сборки, как и ОС, как и библиотеки. Её менять это определённые усилия, которые не всегда оправданы. Иногда проще это всё зафиксировать.
Тут же задача не использовать компилятор который получает постоянные обновления, а задача собрать программу, причем достаточно старого стандарта. Вполне решаемо.