|
Можно ли задать inline функцию, если она определена в другом файле? |
|
|
|
Nov 15 2012, 12:10
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 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! (А-а-а-а-а! зачем же я пьянствовал вчера, надо было бы сегодня!)
|
|
|
|
|
Nov 15 2012, 12:34
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(ViKo @ Nov 15 2012, 15:10)  размерчик получился больше (!), чем когда функция была определена в fun.c файле. Code = 29744 вместо 29224. Дался Вам этот кейл... В ГЦЦ Код static inline __attribute__((always_inline)) void somefunc(const int argument) И всё. Ничего не растет без спроса у хозяина битов
|
|
|
|
|
Nov 15 2012, 13:15
|

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

|
Цитата(_Pasha @ Nov 15 2012, 15:34)  Дался Вам этот кейл... В ГЦЦ И в Keil есть такие штуки (эквивалентны): __attribute__((always_inline)) __forceinline Добавляются к прототипу функции.
|
|
|
|
|
Nov 15 2012, 13:27
|
Гуру
     
Группа: Свой
Сообщений: 2 198
Регистрация: 23-12-04
Пользователь №: 1 640

|
Цитата(ViKo @ Nov 15 2012, 17:15)  И в Keil есть такие штуки (эквивалентны): __attribute__((always_inline)) __forceinline Добавляются к прототипу функции. это к функциям в файле относится, у gcc тоже есть always_inline http://gcc.gnu.org/onlinedocs/gcc/Inline.htmlЦитата(ViKo @ Nov 15 2012, 16:10)  Если последний вопрос ко мне, то у меня есть заголовочный файл (упрощенно говоря) fun.h, который подключается к main.c файлу, и где был описан прототип функции: для инлайна ему нужен не прототип, а код функции. вопрос был риторический я для каких-то извращенных архитектур, где вообще стека нету, сталкивался с тем, что инлайлинье делает линкер при сборке "экзешника", но это исключительное извращение, по-моему в нынешних компиляторах нет такой фазы, чтобы шарится по всем объектникам и искать там коды для инлайнов ----------- btw: static к определению фукнции (или переменной) дописывают чтобы не загаживать пространство имен, она как бы локальная получается и линкер такой функции не видит (это для больших проектов полезно) у фукнции или не стековой (обычно называют глобальной) переменной это больше ни на что не влияет.
|
|
|
|
|
Nov 16 2012, 10:41
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 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 ?
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|