К сожалению, не все компиляторы полностью соответствуют C99 в этой точке, даже если они утверждают, что они будут.
Соответствующий способ сделать это
// header file. an inline declaration alone is
// not supposed to generate an external symbol
inline void toto(void) {
// do something
}
// in one .c file, force the creation of an
// external symbol
extern inline void toto(void);
Более новые версии gcc, например, будут хорошо работать с этим.
Вы можете сойти с рук для других компиляторов (претендентов), определив что-то вроде
#ifdef PRETENDER
# define inlDec static
# define inlIns static
#else
# define inlDec
# define inlIns extern
#endif
// header file. an inline declaration alone is
// not supposed to generate an external symbol
inlDec inline void toto(void) {
// do something
}
// in one .c file, force the creation of an
// external symbol
inlIns inline void toto(void);
Edit:
компиляторы с поддержкой C99 (обычно опция -std=c99
), о которых я знаю
- gcc (версии> = 4.3 IIRC) реализует
правильная
inline
модель
- ПКК также правильно
- ggc <4.3 требуется специальная опция для
реализовать правильную модель,
в противном случае они используют свою собственную модель
что приводит к множественному определению
символы, если вы не осторожны </li>
- icc просто испускает символы в каждой единице
если вы не будете особенно внимательны Но
эти символы являются «слабыми» символами, поэтому
они не порождают конфликт. Oни
просто взорви свой код.
- opencc, AFAIR, следует старой специфической модели gcc
- clang вообще не генерирует символы для
inline
функций, если только у вас нет extern
объявлений и , вы используете указатель функции в одной единице компиляции.
- tcc просто игнорирует ключевое слово
inline