|
#define FUNCTION() vs. inline Function(), второе более "модно", а почему? |
|
|
|
Sep 3 2015, 08:13
|

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

|
Собственно, весь вопрос в заголовке темы. Помню фразы, что в C++ роль макроопределений много меньше, чем в C. Стало быть, надо ориентироваться на inline функции? К примеру, задать бит в порту можно с одинаковым успехом обоими вариантами. Для единообразия пошел по второму: Код __forceinline void FpRq_off(void) { GPIOA->BSRR = FPRQ_H; } Но, скажем, функцию задержки, вычисляющую начальное значение счетчика в зависимости от времени, делаю комбинацией макрофункции со встроенной функцией. Код #define DELAY(VALUE, UNIT) \ DelayFourCycles(((VALUE) * UNIT * (SYSCLK / 1000000) + 3999) / 4000)
#pragma push #pragma O3 __forceinline void DelayFourCycles(uint32_t FC) { __asm { LOOP: SUBS FC, FC, #1 BNE LOOP } } #pragma pop Хочу просветления. Или уже...?
|
|
|
|
|
 |
Ответов
|
Sep 4 2015, 05:39
|
Частый гость
 
Группа: Участник
Сообщений: 78
Регистрация: 7-04-10
Из: Пушкино
Пользователь №: 56 462

|
Inline-функции, как было сказано, позволяют сделать меньше ошибок: проверка типов + отладка в пошаговом режиме. Всегда можно вспомнить пример про вызов макроса MAX(a++,  . Как сделать в виде функции макрос ТС зависит от того как определены PORTA, PORTB etc. Скорее всего static inline void GpioConf(GPIO_TypeDef port, uin32_t...) {...}. Не?
|
|
|
|
|
Sep 4 2015, 08:30
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (ViKo @ Sep 4 2015, 10:37)  Немного некомфортно, что inline функцию нужно вставлять в заголовочный файл *.h, а не в *.c. Чтобы ее можно было использовать в другом файле. А что, с макросами как-то иначе  . Смущает .h? так назовите .c - какие проблемы? QUOTE А сколько переменных можно передать в функцию? ничего не треснет?  Треснет - стек, если его размера не хватит для размещения всех передаваемых переменных.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Sep 4 2015, 08:38
|

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

|
Цитата(zltigo @ Sep 4 2015, 11:30)  А что, с макросами как-то иначе  . Смущает .h? так назовите .c - какие проблемы? Э-э, себя-то не обманешь... include так include. Я не говорю, что прямо воротит, просто не тем цветом в Notepad++ раскрашивает. Цитата Треснет - стек, если его размера не хватит для размещения всех передаваемых переменных. Там не будет использоваться стек, эти переменные заменяются макроопределениями. Код /*! GPIO Mode Type */ typedef enum { MD_IN, //!< Input * MD_GO, //!< General purpose output MD_AF, //!< Alternate function MD_AN //!< Analog } GPIO_MODE_t; и т.д. Я так думаю.
|
|
|
|
|
Sep 4 2015, 09:11
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (ViKo @ Sep 4 2015, 11:38)  Э-э, себя-то не обманешь... include так include. Я не говорю, что прямо воротит, просто не тем цветом в Notepad++ раскрашивает.  Не понимаю в чем обман. QUOTE Там не будет использоваться стек, эти переменные - макроопределения. Вы это как-бы подумайте, прежде, чем такое писать. Функции глубоко безразлично, она по любому получает переменные в стеке или/и в регистрах.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
Сообщений в этой теме
ViKo #define FUNCTION() vs. inline Function() Sep 3 2015, 08:13 dimka76 Например с точки зрения удобства.
С инлайн фукциям... Sep 3 2015, 08:25 zltigo QUOTE (dimka76 @ Sep 3 2015, 11:25) С инл... Sep 3 2015, 11:58 ViKo Еще один пример. Я не представляю, как сделать это... Sep 3 2015, 08:39 CrimsonPig Цитата(ViKo @ Sep 3 2015, 09:13) Собствен... Sep 3 2015, 09:19 ViKo Цитата(CrimsonPig @ Sep 3 2015, 12:19) Ва... Sep 3 2015, 10:31 _4afc_ В Watcom C inline не всегда инлайнились если inlin... Sep 3 2015, 09:34     CrimsonPig Цитата(zltigo @ Sep 4 2015, 10:11) Вы это... Sep 4 2015, 09:22      zltigo QUOTE (CrimsonPig @ Sep 4 2015, 12:22) Ну... Sep 4 2015, 09:44       ViKo Цитата(zltigo @ Sep 4 2015, 12:44) В вопр... Sep 4 2015, 09:50     ViKo Цитата(zltigo @ Sep 4 2015, 12:11) Функци... Sep 4 2015, 09:35      CrimsonPig Цитата(ViKo @ Sep 4 2015, 10:35) Сейчас м... Sep 4 2015, 09:51       ViKo Цитата(CrimsonPig @ Sep 4 2015, 12:51) Ну... Sep 4 2015, 09:55        CrimsonPig Цитата(ViKo @ Sep 4 2015, 10:55) Я не вол... Sep 4 2015, 10:07      zltigo QUOTE (ViKo @ Sep 4 2015, 12:35) И что, i... Sep 4 2015, 10:18       Dog Pawlowa Цитата(zltigo @ Sep 4 2015, 13:18) В идеа... Sep 6 2015, 18:46 ViKo А я проверил. Всё то же, inline функция GPIO_conf(... Sep 7 2015, 09:03 Valentine Loginov Если много аргументов - передавайте указатель на с... Sep 10 2015, 07:02
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|