Вместо ответа «что он делает?» Я отвечаю «как заставить его делать то, что я хочу?» Существует 5 видов встраивания, все они доступны в GNU C89, стандарте C99 и C ++:
всегда в строке, если адрес не взят
Добавьте __attribute__((always_inline))
к любому объявлению, затем используйте один из
ниже случаи, чтобы обработать возможность взятия его адреса.
Вы, вероятно, никогда не должны использовать это, если вам не нужна его семантика (например, чтобы повлиять на сборку определенным образом или использовать alloca
). Компилятор обычно лучше вас знает, стоит ли оно того.
встроенный и испускающий слабый символ (например, C ++, он же «просто заставь это работать»)
__attribute__((weak))
void foo(void);
inline void foo(void) { ... }
Обратите внимание, что это оставляет кучу копий одного и того же кода, а компоновщик выбирает один произвольно.
встроенный, но никогда не испускает никакого символа (оставляя внешние ссылки)
__attribute__((gnu_inline))
extern inline void foo(void) { ... }
всегда излучать (для одного TU, для разрешения предыдущего)
Подсказка выдает слабый символ в C ++, но сильный символ в любом из диалектов C:
void foo(void);
inline void foo(void) { ... }
Или вы можете сделать это без подсказки, которая испускает сильный символ на обоих языках:
void foo(void) { ... }
Как правило, вы знаете, на каком языке ваш TU, когда вы предоставляете определения, и, вероятно, вам не нужно много вставлять.
встроенный и излучаемый в каждом ТУ
static inline void foo(void) { ... }
Для всех этих, кроме static
, вы можете добавить void foo(void)
объявление выше. Это помогает с «наилучшей практикой» написания чистых заголовков, а затем #include
в виде отдельного файла со встроенными определениями. Затем, если используются строчные символы в стиле C, #define
некоторые макросы по-разному в одном выделенном TU для предоставления определений вне строки.
Не забудьте extern "C"
, если заголовок может использоваться как на C, так и на C ++!