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

Можно ли задать inline функцию, если она определена в другом файле?

Об этом уже говорили, и выходит, что нельзя. Или все же есть способ? Или компилятор (Keil для Cortex) не дурак, сам встроит функцию, если она окажется небольшой? Например, такой:

inline bool Timer_check(void) {
  return (TIM6->SR);            // Check Update Interrupt Flag in Status
}

С inline, кстати, не компилируется.

Или надо было ее написать в виде макро?

 

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


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

Или надо было ее написать в виде макро?

Написать static inline и расположить в .h файле

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


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

а как компилятор узнает, какой код ему инлайнить?

в h файле ее можно описать и инклюдить и в этот файл и в другой

 

 

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


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

Если последний вопрос ко мне, то у меня есть заголовочный файл (упрощенно говоря) fun.h, который подключается к main.c файлу, и где был описан прототип функции:

bool Timer_check(void);

А если добавить inline и к прототипу, и к определению функции, то не компилируется.

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

 

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

 

P.S. А если добавляю inline только к прототипу или к определению, то компилируется, но уже с размером 29232!

(А-а-а-а-а! зачем же я пьянствовал вчера, надо было бы сегодня!)

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


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

размерчик получился больше (!), чем когда функция была определена в fun.c файле. Code = 29744 вместо 29224.

Дался Вам этот кейл... В ГЦЦ

static inline __attribute__((always_inline)) void somefunc(const int argument)

И всё. Ничего не растет без спроса у хозяина битов :)

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


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

Дался Вам этот кейл... В ГЦЦ

И в Keil есть такие штуки (эквивалентны):

__attribute__((always_inline))

__forceinline

Добавляются к прототипу функции.

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


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

И в Keil есть такие штуки (эквивалентны):

__attribute__((always_inline))

__forceinline

Добавляются к прототипу функции.

 

это к функциям в файле относится, у gcc тоже есть always_inline

 

http://gcc.gnu.org/onlinedocs/gcc/Inline.html

 

Если последний вопрос ко мне, то у меня есть заголовочный файл (упрощенно говоря) fun.h, который подключается к main.c файлу, и где был описан прототип функции:

 

для инлайна ему нужен не прототип, а код функции. вопрос был риторический

 

я для каких-то извращенных архитектур, где вообще стека нету, сталкивался с тем, что инлайлинье делает линкер при сборке "экзешника", но это исключительное извращение, по-моему в нынешних компиляторах нет такой фазы, чтобы шарится по всем объектникам и искать там коды для инлайнов

 

-----------

 

btw: static к определению фукнции (или переменной) дописывают чтобы не загаживать пространство имен, она как бы локальная получается и линкер такой функции не видит (это для больших проектов полезно)

у фукнции или не стековой (обычно называют глобальной) переменной это больше ни на что не влияет.

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


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

это к функциям в файле относится, у gcc тоже есть always_inline

А зачем они тогда вообще нужны, чем inline не годится? :wacko:

А, наверное, задавать принудительно, даже если это и не оптимально.

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


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

А зачем они тогда вообще нужны, чем inline не годится? :wacko:

А, наверное, задавать принудительно, даже если это и не оптимально.

Патамушо always_inline не помещает тело функции в объектник если функция ни разу не вызывалась. А без него - помещает.

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


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

Патамушо always_inline не помещает тело функции в объектник если функция ни разу не вызывалась. А без него - помещает.

объектник - это одно. Линкер разве помещает ее в код, если она не вызывалась ни разу?

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


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

объектник - это одно. Линкер разве помещает ее в код, если она не вызывалась ни разу?

Я неправильно выразился.

Инлайнит независимо от уровня оптимизации, так по стандарту.

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


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

по-моему в нынешних компиляторах нет такой фазы, чтобы шарится по всем объектникам и искать там коды для инлайнов
Не совсем так. Есть режим компиляции (в gcc он называется LTO, в других компиляторах whole program optimization или нечто подобное), который позволяет заинлайнить функцию, даже если ее тело находится в другой единице компиляции и даже если ей там inline не писали.

Но реализуется это конечно не поиском кода в объектниках (в этом режиме в объектниках вообще кода может и не быть) :rolleyes:

 

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


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

А если всю функцию перенести в заголовочный файл fun.h, то работает, независимо, static или без...

Стоит подключить fun.h к нескольким модулям, и сразу станет понятен смысл static.

Без него линкер выдаст ошибку "Multiple definition" - одноименный объект создается в разных модулях.

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


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

Стоит подключить fun.h к нескольким модулям, и сразу станет понятен смысл static.

Без него линкер выдаст ошибку "Multiple definition" - одноименный объект создается в разных модулях.

Это заменяет

#ifndef FUN_H
#define FUN_H
...
#endif

?

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


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

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

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

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

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

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

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

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

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

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