LINUX.ORG.RU

Ответ на: комментарий от MOPKOBKA

Я так понимаю, это «нововведение» в новом стандарте C. gcc тут при чём? Только при том, что он реализует новый стандарт? Если это некорректная программа, зачем её компилировать.

Ну и как обходить - уже сказали, надо просто указать старый стандарт.

https://godbolt.org/z/fvWoWrd7o

vbr ★★★★
()
Ответ на: комментарий от PRN

Ты наверное не так понял. Вот есть у меня c99 код, я ansi не могу указать, слишком старый стандарт, код не компилируется, все что новее тоже, потому что implicit function declaration!

MOPKOBKA ★★★★
()
Ответ на: комментарий от vbr

Я так понимаю, это «нововведение» в новом стандарте C. gcc тут при чём?

Почему оно влияет на -std=c99 которому уже 25 лет? Это проблема компилятора, если стандарт неадекватный, должен быть путь обхода.

Ну и как обходить - уже сказали, надо просто указать старый стандарт.

Мне c99 нужен.

MOPKOBKA ★★★★
()
Последнее исправление: MOPKOBKA (всего исправлений: 1)
Ответ на: комментарий от slackwarrior

Ради одной опции, которая раньше нормально работала? Это неадекватное решение со стороны разработчиков gcc. Причем старый gcc даже теперь новым не собрать, он сам имеет кучу таких ошибок.

Надо ли говорить что это сделал человек из RH судя по коммитам? Я вот сразу догадался.

MOPKOBKA ★★★★
()
Последнее исправление: MOPKOBKA (всего исправлений: 2)
Ответ на: комментарий от MOPKOBKA

Ради одной опции, которая раньше нормально работала?

Ради отсутствия сюрпризов, чтоб молоток в руке не изменялся, нужно искать веские причины обновлять молоток, а не причины не обновлять )))

slackwarrior ★★★★★
()
Ответ на: комментарий от MOPKOBKA

Если у тебя есть «старая» либа, ее компилишь с ansi. Свой «новый» код с c99. Единственное проблемное место может быть с инклудом «старых» хидеров в «новый» код. Но в этом случае есть специально обученные опции для путей, где искать такие хидера. При указании таких опций компилятор, вроде как, ворнинги перестает выдавать для этих хидеров. Но я это уже плохо помню. Такое настраивается один раз и забывается до следующего проекта) Смотри на isystem или что-то похожее. Что будет в этом случае надо будет смотреть.

PRN
()
Ответ на: комментарий от PRN

Свой «новый» код с c99.

При -std=c99 implicit-declaration является неотключаемой ошибкой, он НЕ компилируется. Код которому нужен c99 я назвал старым в оригинальном посте. Например gtk2 уже не поддерживается.

Единственное проблемное место может быть с инклудом «старых» хидеров в «новый» код.

Наоборот тоже бывает. Раньше библиотека требовала только c89, потом стала c99.

MOPKOBKA ★★★★
()
Последнее исправление: MOPKOBKA (всего исправлений: 1)
Ответ на: комментарий от MOPKOBKA

Почему оно влияет на -std=c99 которому уже 25 лет?

Потому, что в этом стандарте это уже был невалидный код. Правильный вопрос должен быть - почему 25 лет они этого не делали?

Это проблема компилятора, если стандарт неадекватный, должен быть путь обхода.

Не проблема и не должен. Если твой код не соответствует никакому стандарту, это проблема только твоего кода. Продолжать держать баги в компиляторе только чтобы ты его не переписывал - это неправильно.

vbr ★★★★
()
Ответ на: комментарий от MOPKOBKA

-std=c99 -fpermissive вот эта белиберда пока ещё работает. Или -std=c99 -Wno-implicit-function-declaration

Так что ошибка отключаемая. Хотя я бы озаботился тем, чтобы переписать соответствующий код.

vbr ★★★★
()
Последнее исправление: vbr (всего исправлений: 2)
Ответ на: комментарий от vbr

Программы которыми я пользовался больше не собираются, это очень понятно и объективно. Так что это плохое решение со стороны gcc, и я буду так считать.

Если твой код не соответствует никакому стандарту

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

MOPKOBKA ★★★★
()
Ответ на: комментарий от MOPKOBKA

implicit-function-declaration неотключаемая ошибка. Как собирать старый код?

Это код не то, что старый, а протухший, его переписывать надо, а не собирать.

У меня так брат умер Я на 5 курсе неделю угрохал, пытаясь заставить работать свою первую числодробилку на Си, притом, что прототип этой программы на Паскале я написал и отладил за вечер. А если бы такие штуки были запрещены, программа бы просто не собралась. Там, конечно, одно на другое наложилось: и опечатка в справочнике, из-за которой я не тот инклуд написал, и препроцессорные костыли вместо модульностей, и вот эта вот возможность вызывать необъявленную функцию, и то, что функция фигурировала только в критерии завершения итераций, ни на какие переменные в самой программе не влияя. Наложение всего перечисленного дало просто феерический результат.

Нафиг-нафиг.

hobbit ★★★★★
()
Ответ на: комментарий от hobbit

Это код не то, что старый, а протухший, его переписывать надо, а не собирать.

А может сразу компилятор С выкинуть? Пусть на Rust переписывают. Предлагаю завтра в едином порыве удалить со всех машин устаревший и ужасный gcc (gcc-rust оставим).

MOPKOBKA ★★★★
()
Последнее исправление: MOPKOBKA (всего исправлений: 1)
Ответ на: комментарий от MOPKOBKA

У 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
LamerOk ★★★★★
()
Ответ на: комментарий от hobbit

его переписывать надо, а не собирать.

Покажите мне этих добрых людей

P.S. если не ошибаюсь, то именно эту ошибку я вижу у половины пакетов которые выкидывают из тестируемого дебиана.

einhander ★★★★★
()
Ответ на: комментарий от MOPKOBKA

Например gtk2 уже не поддерживается.

GCC в таком случае не проще закопать? Они там и дальше будут совместимость ломать. Мне кажется тут либо собирать все с совместимой версией GCC, либо использовать другой компилятор.

vbcnthfkmnth123 ★★★★★
()
Последнее исправление: vbcnthfkmnth123 (всего исправлений: 1)
Ответ на: комментарий от einhander

P.S. если не ошибаюсь, то именно эту ошибку я вижу у половины пакетов которые выкидывают из тестируемого дебиана.

Так дебиан же славен тем, что любит патчить все свои программы так, что родная мать потом не узнаёт. А тут чего застеснялись?

vbr ★★★★
()
Ответ на: комментарий от no-dashi-v2

Если у тебя c99

Так у него же не его программы, насколько я понял. Или тут предложение переписать все старые программы?

Код которому нужен c99 я назвал старым в оригинальном посте. Например gtk2 уже не поддерживается.

То есть берутся старые программы(не его), происходит попытка собрать их с новой версией компилятора и фейл.

vbcnthfkmnth123 ★★★★★
()
Ответ на: комментарий от vbcnthfkmnth123

То есть берутся старые программы(не его), происходит попытка собрать их с новой версией компилятора и фейл.

Ну в общем-то это норма. Я вот щас пишу фирмварь, там gcc 9. В поздних версиях ошибка в SDK производителя, как минимум в одном месте. Я, конечно, могу поправить, но зачем? SDK производителя тестировался с 9, ну и пускай будет она.

Версия компилятора это такая же фиксированная часть сборки, как и ОС, как и библиотеки. Её менять это определённые усилия, которые не всегда оправданы. Иногда проще это всё зафиксировать.

vbr ★★★★
()
Последнее исправление: vbr (всего исправлений: 2)
Ответ на: комментарий от vbcnthfkmnth123

Ну так флаг компилятору добавь чтобы не юзать новый стандарт если у тебя старая программа

Но тс хочет новый стандарт а код ему не соответствует, и ошибка закономерна

no-dashi-v2 ★★★
()
Ответ на: комментарий от anonymous

Например lacc (https://github.com/larmel/lacc), scc(https://git.simple-cc.org/scc/file/README.html ), tcc (https://bellard.org/tcc/)

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

vbcnthfkmnth123 ★★★★★
()