Перейти к содержанию
    

inline действует в пределах одного файла???

Blackfin 700, CCES

 

inline почему-то ведёт себя как static - функция видна только в том файле, где определена, сколько её не объявляй в других файлах.

Разве должно так быть?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Встраиваемая функция обычно определяется (т.е. описывается вместе с телом) в заголовочном файле. К компилятор должен "видеть" тело функции в точке встраивания, иначе он не сможет этого сделать. Таким образом, встраиваемая функция видна во всех единицах компиляции, которые включают заголовочный файл с её определением. Это то же самое, что определять эту функцию в каждой единице компиляции вручную (требуется строгая идентичность определений).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здесь правильнее было бы еще уточнить, какая версия C/C++ используется, т.к. в разных версиях языка (по крайней мере в C) inline вместе со static или extern работают несколько совершенно взаимопротивоположно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 часа назад, dxp сказал:

Это то же самое, что определять эту функцию в каждой единице компиляции вручную (требуется строгая идентичность определений).

Как раз в этом случае - идентичность не требуется. Поскольку функция видна только в одной единице компиляции - кофликта не будет. Но мозг в таком случае программист на отладке сломает - это да.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

28 минут назад, Сергей Борщ сказал:

Поскольку функция видна только в одной единице компиляции - кофликта не будет...

Я думаю, что определение inline func() {} в .c/.cpp-файле может привести к undefined reference, и зависит это от погоды на Марсе.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В старом ADI для BF561 ещё было если по ошибке копипастом напишешь

extern Х=0;

то Х будет локальная...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 минут назад, Arlleex сказал:

Я думаю, что определение inline func() {} в .c/.cpp-файле может привести к undefined reference, и зависит это от погоды на Марсе.

Недопонял. Чем такое определение с точки зрения компилятора отличается от определения в заголовочном файле, включенном в этот же .cpp (в сях inline вообще нет)?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, Сергей Борщ сказал:

Как раз в этом случае - идентичность не требуется. Поскольку функция видна только в одной единице компиляции - кофликта не будет. Но мозг в таком случае программист на отладке сломает - это да.

Я хотел сказать следующее. Если определить две одноимённые функции (обычные, невстраиваемые) в разных единицах трансляции, то на этапе линковки будет redeclaration error. Слово inline исправляет это, но содержимое функций должно быть идентичным. Т.е. определение одноимённых функций в разных единицах трансляции допускается только для встраиваемых функций и при условии, что они строго одинаковые. 

1 час назад, Arlleex сказал:

Я про это.

Похоже, что там у него какой-то локальный глюк. Код вполне валидный. 


https://wandbox.org/permlink/5OrehImoyaEwPr6V

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

20 минут назад, dxp сказал:

Т.е. определение одноимённых функций в разных единицах трансляции допускается только для встраиваемых функций и при условии, что они строго одинаковые. 

Почему? Утверждается, что нет. Можно легко проверить, в конце концов.

20 минут назад, dxp сказал:

Это, ИМХО, мало о чем говорит, т.к. опять же, встраивать или нет - компилятор решать вправе сам. К слову сказать, я сталкивался ровно с такой же ситуацией у себя в проекте - inline (без static) foo() {} в исходнике с какого-то момента просто перестала компилироваться. Добавил static inline и все стало ок.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 минуты назад, Arlleex сказал:

Почему? Утверждается, что нет. Можно легко проверить, в конце концов.

 

Не понял, что вы хотели сказать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 минуту назад, dxp сказал:

Не понял, что вы хотели сказать.

Там пример двух функций - обе определены как встроенные, только одна из них имеет внешнее определение. Тела - разные.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так 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.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

14 hours ago, Dr.Alex said:

Разве должно так быть?

Естественно! Инлайн происходит на стадии компиляции, а не линковки!

Для того, чтобы одну и ту же инлайн-функцию могли "видеть" разные сишные файлы, нужно вынести все "общие" инлайны как static inline в отдельный заголовочный файл.

НО! Современные gcc ведут себя так, что если вызов функции окажется выгодней для заданного уровня оптимизации, то даже static inline не гарантирует, что функция будет заинлайнена!!! Если хотите стопроцентный инлайн, то исключительно макросы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...