реклама на сайте
подробности

 
 
> Можно ли задать inline функцию, если она определена в другом файле?
ViKo
сообщение Nov 15 2012, 11:40
Сообщение #1


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Об этом уже говорили, и выходит, что нельзя. Или все же есть способ? Или компилятор (Keil для Cortex) не дурак, сам встроит функцию, если она окажется небольшой? Например, такой:
Код
inline bool Timer_check(void) {
  return (TIM6->SR);            // Check Update Interrupt Flag in Status
}

С inline, кстати, не компилируется.
Или надо было ее написать в виде макро?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
ViKo
сообщение Nov 15 2012, 12:10
Сообщение #2


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Если последний вопрос ко мне, то у меня есть заголовочный файл (упрощенно говоря) fun.h, который подключается к main.c файлу, и где был описан прототип функции:
bool Timer_check(void);
А если добавить inline и к прототипу, и к определению функции, то не компилируется.
А если всю функцию перенести в заголовочный файл fun.h, то работает, независимо, static или без... только размерчик получился больше (!), чем когда функция была определена в fun.c файле. Code = 29744 вместо 29224.

upd. не ту функцию показал, поправил.

P.S. А если добавляю inline только к прототипу или к определению, то компилируется, но уже с размером 29232!
(А-а-а-а-а! зачем же я пьянствовал вчера, надо было бы сегодня!)
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Nov 16 2012, 10:33
Сообщение #3


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(ViKo @ Nov 15 2012, 16:10) *
А если всю функцию перенести в заголовочный файл fun.h, то работает, независимо, static или без...

Стоит подключить fun.h к нескольким модулям, и сразу станет понятен смысл static.
Без него линкер выдаст ошибку "Multiple definition" - одноименный объект создается в разных модулях.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
ViKo
сообщение Nov 16 2012, 10:41
Сообщение #4


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(MrYuran @ Nov 16 2012, 13:33) *
Стоит подключить fun.h к нескольким модулям, и сразу станет понятен смысл static.
Без него линкер выдаст ошибку "Multiple definition" - одноименный объект создается в разных модулях.

Это заменяет
Код
#ifndef FUN_H
#define FUN_H
...
#endif

?
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Nov 16 2012, 11:57
Сообщение #5


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(ViKo @ Nov 16 2012, 14:41) *
Это заменяет

?

Нет, это просто защита от повторного включения внутри единицы компиляции, коей является c/cpp файл.
аналог #pragma once

А речь идет о включении в разные модули, которые скомпилируются независимо и без вопросов, а в результате в разных объектных файлах окажутся одинаковые имена объектов, и уже линкер начнет вопить.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
ViKo
сообщение Nov 16 2012, 12:04
Сообщение #6


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(MrYuran @ Nov 16 2012, 14:57) *
Нет, это просто защита от повторного включения внутри единицы компиляции, коей является c/cpp файл.
аналог #pragma once

А речь идет о включении в разные модули, которые скомпилируются независимо и без вопросов, а в результате в разных объектных файлах окажутся одинаковые имена объектов, и уже линкер начнет вопить.

То, что я показал, позволяет мне в одном общем file.h собрать заголовочные файлы для всех составляющих проекта, и потом подключать только его во все files.c.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- ViKo   Можно ли задать inline функцию, если она определена в другом файле?   Nov 15 2012, 11:40
- - MrYuran   Цитата(ViKo @ Nov 15 2012, 15:40) Или над...   Nov 15 2012, 11:54
- - yes   а как компилятор узнает, какой код ему инлайнить? ...   Nov 15 2012, 11:54
|- - _Pasha   Цитата(ViKo @ Nov 15 2012, 15:10) размерч...   Nov 15 2012, 12:34
||- - _Артём_   Цитата(_Pasha @ Nov 15 2012, 14:34) Дался...   Nov 15 2012, 12:53
||- - ViKo   Цитата(_Pasha @ Nov 15 2012, 15:34) Дался...   Nov 15 2012, 13:15
||- - yes   Цитата(ViKo @ Nov 15 2012, 17:15) И в Kei...   Nov 15 2012, 13:27
||- - ViKo   Цитата(yes @ Nov 15 2012, 16:23) это к фу...   Nov 15 2012, 13:27
||- - XVR   Цитата(yes @ Nov 15 2012, 17:27) по-моему...   Nov 16 2012, 07:47
|- - demiurg_spb   не совсем Вам уже про LTO советовали, а я повторюс...   Nov 16 2012, 11:19
||- - ViKo   Цитата(demiurg_spb @ Nov 16 2012, 14:19) ...   Nov 16 2012, 11:49
- - _Pasha   Цитата(ViKo @ Nov 15 2012, 17:27) А зачем...   Nov 15 2012, 13:40
- - toweroff   Цитата(_Pasha @ Nov 15 2012, 17:40) Патам...   Nov 15 2012, 16:53
- - _Pasha   Цитата(toweroff @ Nov 15 2012, 20:53) объ...   Nov 15 2012, 17:21


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 16th June 2025 - 16:33
Рейтинг@Mail.ru


Страница сгенерированна за 0.01454 секунд с 7
ELECTRONIX ©2004-2016