Вопрос

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

Это было полезно?

Решение

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

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

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

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

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

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

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

Другие советы

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

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

Пожалуйста, посмотрите на этот пост: Миф и реальность о встроенном в C99

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

Здесь, теперь это «портативные через компиляторы»:

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top