demiurg_spb 0 28 марта, 2017 Опубликовано 28 марта, 2017 · Жалоба Вот уже как лет 15 программирую на Си и думал, что уже знаю всё и вся, но на прошлой удивился следующему: Оказывается, если реализацию функции поместить в заголовочном файле unit.h и описать её как inline void foo(void) { do something...} , без слова static а в файле unit.c поместить следующее extern inline void foo(void); то компилятор гарантировано создаст экземпляр этой функции для внешнего вызова, а в других модулях, включающих заголовочный файл unit.h, эта функция может заинлайнится, либо будет вызвана из модуля unit.c (это зависит от уровня оптимизации и отдано на откуп компилятору). Вот такие пироги))) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
novikovfb 19 28 марта, 2017 Опубликовано 28 марта, 2017 · Жалоба и что это может дать с практической точки зрения? ИМХО, надо или объявлять как static inline или делать обычную функцию в зависимости от направления оптимизации (размер или скорость). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 28 марта, 2017 Опубликовано 28 марта, 2017 · Жалоба Если интересно, почитайте стандарт С99 - там написано то, о чём я вкратце изложил. Даёт именно то о чём я сказал: в случае разделной компиляции без LTO, если компилятор не заинлайнит эту функцию в различных единицах трансляции, то мы всё равно получим ЛИШЬ ОДИН экземпляр этой функции. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться