Встроенные функции / методы - PullRequest
3 голосов
/ 24 марта 2012

Оператор: «Встроенные функции должны быть определены до их вызова.»

Правильно ли это утверждение?

[EDIT]

Вопрос изначально на немецком языке:
Inline-Funktionen Müssen vor ihrem Aufruf определен sein.

Может быть, это кому-нибудь поможет ...

Ответы [ 3 ]

5 голосов
/ 24 марта 2012

Да, это правильно, но только частично. Может быть правильно оформлено следующим образом:

"Встроенные функции должны быть определены в каждой единице перевода (но не обязательно до), в которой они вызываются."

C11 ++ Стандарт: §7.1.2.4

Встроенная функция должна быть определена в каждой единице перевода, в которой она используется, и должна имеют в каждом случае одно и то же определение. [Примечание: вызов встроенной функции может встретиться до того, как ее определение появится в блоке перевода. —Конечная записка]

Почему это обоснование?

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

Чтобы сделать это, компилятору нужно видеть определение при компиляции кода, где вызывается функция. Обычно это делается путем добавления определения функции в заголовок со спецификатором inline и последующего включения файла заголовка в каждый файл cpp, где должна вызываться функция.

0 голосов
/ 24 марта 2012

Нет. C ++ 11 черновик n3242 более четко, чем в более ранних спецификациях, изложенных в подразделе 7.1.2;

Встроенная функция должна быть определена в каждой единице перевода, в которой он используется odr и должен иметь одно и то же определение в каждом случае (3.2). [Примечание: вызов встроенной функции может возникнуть раньше его определение появляется в переводческой единице. - Конечная нота]

0 голосов
/ 24 марта 2012

Это утверждение не имеет смысла: встроенная функция больше не вызывается, код просто присутствует в текущей функции (она была «встроенной»). Так что нет, я бы сказал, что это неправильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...