Dr.Alex 0 21 декабря, 2021 Опубликовано 21 декабря, 2021 · Жалоба Blackfin 700, CCES inline почему-то ведёт себя как static - функция видна только в том файле, где определена, сколько её не объявляй в других файлах. Разве должно так быть? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 67 22 декабря, 2021 Опубликовано 22 декабря, 2021 · Жалоба Встраиваемая функция обычно определяется (т.е. описывается вместе с телом) в заголовочном файле. К компилятор должен "видеть" тело функции в точке встраивания, иначе он не сможет этого сделать. Таким образом, встраиваемая функция видна во всех единицах компиляции, которые включают заголовочный файл с её определением. Это то же самое, что определять эту функцию в каждой единице компиляции вручную (требуется строгая идентичность определений). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 190 22 декабря, 2021 Опубликовано 22 декабря, 2021 · Жалоба Здесь правильнее было бы еще уточнить, какая версия C/C++ используется, т.к. в разных версиях языка (по крайней мере в C) inline вместе со static или extern работают несколько совершенно взаимопротивоположно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 22 декабря, 2021 Опубликовано 22 декабря, 2021 · Жалоба 4 часа назад, dxp сказал: Это то же самое, что определять эту функцию в каждой единице компиляции вручную (требуется строгая идентичность определений). Как раз в этом случае - идентичность не требуется. Поскольку функция видна только в одной единице компиляции - кофликта не будет. Но мозг в таком случае программист на отладке сломает - это да. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 190 22 декабря, 2021 Опубликовано 22 декабря, 2021 · Жалоба 28 минут назад, Сергей Борщ сказал: Поскольку функция видна только в одной единице компиляции - кофликта не будет... Я думаю, что определение inline func() {} в .c/.cpp-файле может привести к undefined reference, и зависит это от погоды на Марсе. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_4afc_ 27 22 декабря, 2021 Опубликовано 22 декабря, 2021 · Жалоба В старом ADI для BF561 ещё было если по ошибке копипастом напишешь extern Х=0; то Х будет локальная... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 22 декабря, 2021 Опубликовано 22 декабря, 2021 · Жалоба 8 минут назад, Arlleex сказал: Я думаю, что определение inline func() {} в .c/.cpp-файле может привести к undefined reference, и зависит это от погоды на Марсе. Недопонял. Чем такое определение с точки зрения компилятора отличается от определения в заголовочном файле, включенном в этот же .cpp (в сях inline вообще нет)? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 190 22 декабря, 2021 Опубликовано 22 декабря, 2021 · Жалоба 36 минут назад, Сергей Борщ сказал: Недопонял... Я про это. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 67 22 декабря, 2021 Опубликовано 22 декабря, 2021 · Жалоба 2 часа назад, Сергей Борщ сказал: Как раз в этом случае - идентичность не требуется. Поскольку функция видна только в одной единице компиляции - кофликта не будет. Но мозг в таком случае программист на отладке сломает - это да. Я хотел сказать следующее. Если определить две одноимённые функции (обычные, невстраиваемые) в разных единицах трансляции, то на этапе линковки будет redeclaration error. Слово inline исправляет это, но содержимое функций должно быть идентичным. Т.е. определение одноимённых функций в разных единицах трансляции допускается только для встраиваемых функций и при условии, что они строго одинаковые. 1 час назад, Arlleex сказал: Я про это. Похоже, что там у него какой-то локальный глюк. Код вполне валидный. https://wandbox.org/permlink/5OrehImoyaEwPr6V Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 190 22 декабря, 2021 Опубликовано 22 декабря, 2021 · Жалоба 20 минут назад, dxp сказал: Т.е. определение одноимённых функций в разных единицах трансляции допускается только для встраиваемых функций и при условии, что они строго одинаковые. Почему? Утверждается, что нет. Можно легко проверить, в конце концов. 20 минут назад, dxp сказал: https://wandbox.org/permlink/5OrehImoyaEwPr6V Это, ИМХО, мало о чем говорит, т.к. опять же, встраивать или нет - компилятор решать вправе сам. К слову сказать, я сталкивался ровно с такой же ситуацией у себя в проекте - inline (без static) foo() {} в исходнике с какого-то момента просто перестала компилироваться. Добавил static inline и все стало ок. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 67 22 декабря, 2021 Опубликовано 22 декабря, 2021 · Жалоба 3 минуты назад, Arlleex сказал: Почему? Утверждается, что нет. Можно легко проверить, в конце концов. Не понял, что вы хотели сказать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 190 22 декабря, 2021 Опубликовано 22 декабря, 2021 · Жалоба 1 минуту назад, dxp сказал: Не понял, что вы хотели сказать. Там пример двух функций - обе определены как встроенные, только одна из них имеет внешнее определение. Тела - разные. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 67 22 декабря, 2021 Опубликовано 22 декабря, 2021 · Жалоба Так extern inline - это отдельный случай. Речь шла именно об обычном (без модификаторов) inline. Цитата There may be more than one definition of an inline function or variable (since C++17) in the program as long as each definition appears in a different translation unit and (for non-static inline functions and variables (since C++17)) all definitions are identical. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 22 декабря, 2021 Опубликовано 22 декабря, 2021 · Жалоба Непонятно такое требование. На стадии компиляции компилятор другие единицы трансляции не видит, а на этапе линковки они уже встроены и наружу не торчат. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Eddy_Em 2 22 декабря, 2021 Опубликовано 22 декабря, 2021 · Жалоба 14 hours ago, Dr.Alex said: Разве должно так быть? Естественно! Инлайн происходит на стадии компиляции, а не линковки! Для того, чтобы одну и ту же инлайн-функцию могли "видеть" разные сишные файлы, нужно вынести все "общие" инлайны как static inline в отдельный заголовочный файл. НО! Современные gcc ведут себя так, что если вызов функции окажется выгодней для заданного уровня оптимизации, то даже static inline не гарантирует, что функция будет заинлайнена!!! Если хотите стопроцентный инлайн, то исключительно макросы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться