Как компилятор решает, следует ли рассматривать функцию как встроенную или нет?
В отличие от компоновки, не существует такого понятия, как «встроенные» конфликты (объявления с одним и тем же именем могут быть встроенными или нет).
Например, несколько объявлений функций могут быть встроенными или нет, например:
inline static void test(); // declaration with inline
int main()
{
extern void test(); // declaration without inline.
test();
}
static void test() // definition does not have inline
{
}
or
static void test(); // declaration without inline
int main()
{
test();
}
inline static void test() // but definition has inline!
{
}
В каждом случае встраивается ли функция test()?
Мой реальный вопрос: как компилятор обнаруживает, что функция должна быть встроена? Проверяет ли он, содержит ли самое последнее объявление встроенное ключевое слово, или проверяет, содержит ли определение встроенное ключевое слово или нет?
Я попытался найти это в стандарте, но не смог найти никаких правил, касающихся этой двусмысленности. Похоже, что inline очень расплывчато определен в стандарте.
(Сначала я думал, что должно быть «правило», которое предписывает, что после объявления встроенной функции каждое объявление с тем же именем также должно быть встроенным.)
РЕДАКТИРОВАТЬ: я в основном спрашиваю, как компилятор решает неоднозначность нескольких объявлений с одинаковыми именами, только некоторые из которых содержат встроенное ключевое слово.
inline static void test() // definition with inline keyword
{
}
int main()
{
extern void test(); // declaration without inline
test(); // Does compiler consider inlining or not?
}
inline
вне своего кода и позвольте компилятору побеспокоиться. - person pmg   schedule 17.11.2011test
имеет внутреннюю связь в первом объявлении и внешнюю ссылку во втором объявлении, которое игнорируется 6.2.2/4, идентификатор по-прежнему имеет внутреннюю связь. - person Steve Jessop   schedule 17.11.2011extern
- объявление встроенной функции сextern
в области файла (но не в области функции, как в вашем первом примере) обеспечивает внешнее определение. В противном случае нет внешнего определения. - person Steve Jessop   schedule 17.11.2011