Альтернативы C "inline" ключевое слово - PullRequest
3 голосов
/ 29 ноября 2010

От моего преподавателя курса он неоднократно подчеркивал и просил нас не использовать ключевое слово "inline" для функций. Он говорит, что он не «переносим» во всех компиляторах и не «стандартен». Учитывая это, есть ли «стандартные» альтернативы, которые допускают «встроенное расширение»?

Ответы [ 4 ]

18 голосов
/ 29 ноября 2010

Ваш преподаватель курса не прав.Это это стандарт.Это на самом деле в текущий стандарт, прямо в разделе 6.7.4 Function specifiers (C99).Тот факт, что это предложение для компилятора, которое может быть полностью проигнорировано, не делает его менее стандартным.

Я не думаю, что это было в C89 / 90, что может быть тем, что используют некоторые встроенные компиляторы, но я бы хотел серьезное рассмотрение вопроса об обновлении в этом случае.

Однако, даже когда inline доступен, я обычно оставляю эти решения на усмотрение самого компилятора, так как большинство современных более чем способнывыяснить, как лучше оптимизировать код (и, как правило, гораздо лучше, чем я).Ключевое слово inline, например register и auto, обычно не вызывает у меня беспокойства.

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

Или вы можете вручную встроить код (то есть дублировать его), хотя я бы не предложил это как вариант, поскольку он может быстро стать кошмаром обслуживания.

Сам я бы написал код, используя обычные функции без любых этих уловок, а затем представил бы их при необходимости (и только , если вы можете продемонстрировать, что они необходимы, например,как конкретная проблема производительности).

Вы всегда должны предполагать, что кодер, который должен поддерживать ваш код, является психопатическим убийцей, который знает, где вы живете: -)

2 голосов
/ 29 ноября 2010

Как уже говорили другие, inline был интегрирован в стандарт C. 11 лет назад.

Помимо указанного, inline имеет значение, так как он изменяет свойства видимости функции.В частности, для больших библиотек с большим количеством функций, объявленных только static, у вас может быть одна версия любой из этих функций в всех объектных файлах (например, при компиляции с включенной отладкой).* Пожалуйста, загляните в этот пост: Миф и реальность о встроенном в C99

0 голосов
/ 29 ноября 2010

Здесь, теперь это "переносимость между компиляторами":

#if (__STDC_VERSION__ < 199901L)
#define inline
#endif
static inline int foobar(int x) /* ... */

Кстати, как уже говорили другие, ключевое слово inline - просто подсказка и довольно бесполезное, но важное ключевое слово - static. Если ваша функция не объявлена ​​static, она будет иметь внешнюю связь, и компилятор вряд ли будет считать ее кандидатом для встраивания, когда он сам принимает решение о том, какие функции встроить.

Также обратите внимание, что в отличие от C ++, язык C не позволяет inline без static.

0 голосов
/ 29 ноября 2010

Как бы злы они ни были, макросы по-прежнему остаются главными (хотя определенные компиляторы могут поддерживать дополнительные возможности).

...