Как указано в стандарте
Если объявление идентификатора для функции не имеет спецификатора класса хранения, его связь определяется точно так же, как если бы она была объявлена с помощью спецификатора класса хранения extern
.
Но часть спецификатора функции дает inline
семантику функции следующим образом:
Любая функция с внутренней связью может быть встроенной функцией. Для функции с внешним связыванием применяются следующие ограничения: Если функция объявлена со встроенным спецификатором функции, то она также должна быть определена в той же единице перевода. Если все объявления области действия файла для функции в модуле перевода включают спецификатор встроенной функции без extern
, то определение в этом модуле перевода является встроенным определением.
Случай 1.
static inline void test(void){ //internal linkage, can be an inline function
printf("Test\n");
}
inline void test(void); //does it provide an external definition?
Дело 2.
static inline void test(void){ //internal linkage, can be an inline function
printf("Test\n");
}
extern inline void test(void); //does it provide an external definition?
Дело 3.
static inline void test(void){ //internal linkage, can be an inline function
printf("Test\n");
}
void test(void); //does it provide an external definition?
Iиметь путаницу в отношении трех случаев. Есть ли различия между ними? В настоящее время я думаю о них как о
Случай 1 - не предоставляет внешнего определения (inline
без extern
)
Случай 2 - обеспечивает внешнее определение (inline
с extern
)
Случай 3 - обеспечивает внешнее определение (аналогично extern
)