|
Определение inline функции, Обязательно в хедере? |
|
|
|
Dec 13 2008, 10:38
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Есть несколько файлов исходника: LCD.h с объявлением функции: Код inline void lcdClearScreen(); LCD.c с определением: Код inline void lcdClearScreen() { lcdWriteCommand(0x01); }; и вызов этой функции из третьего файла I2C.c: Код #include "lcd.h" ... lcdClearScreen(); Что-то первый раз столкнулся с тем, что, при компиляции файла I2C.c, компилер выдаёт ошибку про отсутствие определения этой функции Вышел из положения включением определения функции в хедер LCD.h: Код inline void lcdClearScreen() { lcdWriteCommand(0x01); }; Получается, inline функции необходимо определять сразу при объявлении?
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 23)
|
Dec 13 2008, 14:38
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(sonycman @ Dec 13 2008, 12:38)  Получается, inline функции необходимо определять сразу при объявлении? Нет, не так. Просто компилятор должен иметь тело функции на момент встраивания. Иначе откуда он узнает, что именно встраивать? А откуда он возьмет тело - из заголовочного файла или из начала исходника, в котором встретил точку встраивания или из середины этого исходника - не важно. Обычно тело inline-функции размещают в заголовочном файле, чтобы его можно было встроить в любом исходнике, куда подключен заголовок. Ничто не мешает совместить объявление и определение такой функции, что часто и делается для небольших по размеру функций.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jun 2 2012, 17:13
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(Rash @ Jun 2 2012, 19:56)  Можно пример кода, где и что объявлять? Объявлять можно в h-файле Код #define LED_PORT PORTB #pragma inline=forced inline void LedOn() { LED_PORT|=(1<<LED_PIN); } или так: Код #define PRAGMA(x) _Pragma( #x ) #define INLINE PRAGMA( inline=forced ) static
INLINE void LedOn() { LED_PORT|=(1<<LED_PIN); }
|
|
|
|
|
Jun 2 2012, 19:23
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(Rash @ Jun 2 2012, 20:35)  т.е. тело функции должно быть в h файле? Может быть и в с-файле: Код #pragma inline=forced inline static void OffLed() { PORTD.DIRSET=1; PORTD.OUTCLR=1; }
int main() { OffLed(); Цитата(Rash @ Jun 2 2012, 20:35)  Может можно сделать что бы inline объявления были в h, а реализация в С файлах У меня такое сделать не получалось (а зачем оно надо?): линкер ругается чем то наподобии "Undefined OffLed". Видимо это неспроста.
|
|
|
|
|
Jun 2 2012, 20:46
|
Знающий
   
Группа: Свой
Сообщений: 639
Регистрация: 5-09-05
Пользователь №: 8 231

|
Цитата(_Артём_ @ Jun 2 2012, 22:23)  У меня такое сделать не получалось (а зачем оно надо?): линкер ругается чем то наподобии "Undefined OffLed". Видимо это неспроста. Да не получается. Перепробовал наверное вариантов 20, так и не нашёл как. Удобно в С файлах код, а в h описание ф-ций.
|
|
|
|
|
Jun 3 2012, 13:53
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (Rash @ Jun 3 2012, 16:43)  не знаю проблема или нет Проблема. Потому что во время компиляции файл2.c компилятор понятия не имеет ни о существовании файл1.c, ни о его содержимом и, соответветственно, о том, что же именно ему нужно вставить в место вызова этой функции. Чтобы он имел возможность встроить, тело функции должно быть ему доступно, а значит располагаться либо в файл2.c, либо в любом файле, включенном в него директивой #include. Других вариантов нет. Хотите красоты - делайте функцию невстраиваемой. По этому пути пошли создатели CMSIS. В ней, чтобы записать одно значение в один регистр вызывается функция со всеми вытекающими тормозами и раздутием кода.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jun 3 2012, 21:39
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(Сергей Борщ @ Jun 3 2012, 16:53)  Хотите красоты - делайте функцию невстраиваемой. По этому пути пошли создатели CMSIS. Это красота? В CMSIS полно inline-функций. В чём неправильность их пути? Цитата(Сергей Борщ @ Jun 3 2012, 16:53)  В ней, чтобы записать одно значение в один регистр вызывается функция со всеми вытекающими тормозами и раздутием кода. А как лучше делать?
|
|
|
|
|
Jun 4 2012, 04:21
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Мне кажется, тут разные люди говорят о разных CMSIS-ах. Та часть, которая от собственно ARM - она состоит вообще исключительно из *.h файлов с инлайн-функциями и определениями структур. (Это файлы core_cm0.h, core_cm3.h, core_cm4.h, core_cm4_simd.h, core_cmFunc.h, core_cmInstr.h.) Остальное - это уже от производителя конкретного контроллера. И здесь уже конечно бывают навороты  Кстати, ST здесь на удивление скромны - всего-лишь startup_xxx.s и system_xxx.c. Остальное - опять же хидеры. Зато уж в своей StdPeriph библиотеке они уже оторвались по полной
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|