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

extern inline

Вот уже как лет 15 программирую на Си и думал, что уже знаю всё и вся, но на прошлой удивился следующему:

 

Оказывается, если реализацию функции поместить в заголовочном файле unit.h и описать её как

inline void foo(void) { do something...}

, без слова static

а в файле unit.c поместить следующее

extern inline void foo(void);

то компилятор гарантировано создаст экземпляр этой функции для внешнего вызова, а в других модулях,

включающих заголовочный файл unit.h, эта функция может заинлайнится, либо будет вызвана из модуля unit.c

(это зависит от уровня оптимизации и отдано на откуп компилятору).

 

Вот такие пироги)))

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


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

и что это может дать с практической точки зрения?

ИМХО, надо или объявлять как static inline или делать обычную функцию в зависимости от направления оптимизации (размер или скорость).

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


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

Если интересно, почитайте стандарт С99 - там написано то, о чём я вкратце изложил.

Даёт именно то о чём я сказал:

в случае разделной компиляции без LTO, если компилятор не заинлайнит эту функцию в различных единицах трансляции, то мы всё равно получим ЛИШЬ ОДИН экземпляр этой функции.

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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