![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
null56 |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 721 Регистрация: 19.3.2008 Репутация: 2 Всего: 12 |
Всем привет
Заинтересовался одним вопросом по поводу модификаторов встаиваемых фукнций (inline) для стандартов C99 и GNU Первое что меня смутило, так это отрывок из книги
Вопрос: если функция объявлена, как inline, то она будет встраиваемой только в том модуле (или единице трансляции) где определена. В случае вызова ее из другого модуля, будет создан код функции и она станет невстраиваемой. Чтобы этого избежать, надо объявлять как статик, тогда ее можно будет вызывать в других модулях и она до сих пор останется встраиваемой. Я правильно понял изложения автора??? Но позже я нарвался на статью http://www.greenend.org.uk/rjk/2003/03/inline.html тут рассматриваются еще вариации использования встраиваемых функций (раздел стандарта C99) и если я правильно перевел текст, то мои выводы следующие: inline - значит встраиваемая только в том модуле, где объявлена и определена, для других модулей ВООБЩЕ не доступна extern inline - встраиваемая только в том модуле, где опредлена и объявлена, но код создается, так что ее можно дергать из других модулей, где она уже будет НЕВСТРАИВАЕМОЙ static inline - вообще не понял отличие от обычной inline Помогите пожалуйста, что имел в виду автор книги, цитату которой я привел и как же всё таки модификаторы inline, inline extern, static inline воздействуют на вызовы и доступность функций в родном и внешних модулях? ЗЫ: Каким же стандартом руководствуются разработчики ядра linux? потому что вот ядерный хедер
Заранее благодарен за помощь |
||||||
|
|||||||
djamshud |
|
|||
![]() Пердупержденный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 23.11.2009 Репутация: 8 Всего: 39 |
static говорит о том, что за пределы текущего .c-файла использование некоторого объекта (не в с++-ном смысле), в т.ч. функции, не выйдет. И что мы имеем: файл1.с включает хедер с функцией, объявленной как inline, файл2.с тоже включает его. Если она static - ее код скопируется и заинлайнится в оба объектных файла, порожденных компиляцей файла1 и файла2.
Вообще советую поэксперементривать с этим самому, понимание тут же придет. -------------------- 'Cuz I never walk away from what I know is right Alice Cooper - Freedom |
|||
|
||||
null56 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 721 Регистрация: 19.3.2008 Репутация: 2 Всего: 12 |
Вот чего мне MAKCim ответил:
по сути тоже самое |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
null56, ты только помни, что inline - это СОВЕТ компилятору сделать функцию встраиваемой. Он этот совет может молча проигнорировать, что с успехом и делает при отключении оптимизации. В С++ код функции с модификатором inline, которая используется в нескольких единицах трансляции, но не встроенная, будет только в одном месте файла. Если ты сделаешь static inline, то код будет во всех единицах. В Си, если я не ошибаюсь, поведение inline несколько отличается, поэтому там без static ее использовать в хидерах проблематично.
|
|||
|
||||
null56 |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 721 Регистрация: 19.3.2008 Репутация: 2 Всего: 12 |
про остальные вариации с учетом ключевой фразы: __КОМПИЛЯТОР_НЕ_ГАРАНТИРУЕТ_ПОДСТАНОВКУ
inline
получается по возможности встраивается в текущий модуль и НЕ может быть вызвана из других, если в других нет определения inline extern
тут ситуация такая: функция может быть подставлена в текущий модуль, но в то же время создается объектный код, который смогут дергать из других модулей вот так я это понял, если есть чего добавить, отпишитесь пожалуйста а пока, спасибо за помощь ЗЫ: bsa, да, согласен, речь об этом и шла (о языке Си)... Максим мое внимание устремил именно на ключевое слово СОВЕТ КОМПИЛЯТОРУ |
||||
|
|||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
null56,
для полного понимания просто сделай пару примеров и скомпилируй с -std=c99 -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |