Jump to content

    

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

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

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

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

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

 

Share this post


Link to post
Share on other sites
Или надо было ее написать в виде макро?

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

Share this post


Link to post
Share on other sites

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

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

 

 

Share this post


Link to post
Share on other sites

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

bool Timer_check(void);

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

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

 

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

 

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

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

Share this post


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

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

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

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

Share this post


Link to post
Share on other sites
Дался Вам этот кейл... В ГЦЦ

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

__attribute__((always_inline))

__forceinline

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

Share this post


Link to post
Share on other sites
И в Keil есть такие штуки (эквивалентны):

__attribute__((always_inline))

__forceinline

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

 

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

 

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

 

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

 

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

 

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

 

-----------

 

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

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

Share this post


Link to post
Share on other sites
это к функциям в файле относится, у gcc тоже есть always_inline

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

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

Share this post


Link to post
Share on other sites
А зачем они тогда вообще нужны, чем inline не годится? :wacko:

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

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

Share this post


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

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

Share this post


Link to post
Share on other sites
объектник - это одно. Линкер разве помещает ее в код, если она не вызывалась ни разу?

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

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

Share this post


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

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

 

Share this post


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

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

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

Share this post


Link to post
Share on other sites
Стоит подключить fun.h к нескольким модулям, и сразу станет понятен смысл static.

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

Это заменяет

#ifndef FUN_H
#define FUN_H
...
#endif

?

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this