Если GCC объявит функцию как inline
, она просто намекает компилятору на встроенную функцию. Однако компилятор по-прежнему будет генерировать не встроенную функцию, которую вы можете вызывать из другого модуля компиляции.
Эти функции имели конфликт имен в вашем случае. Проще говоря: inline не подразумевает статичность.
Что вы хотите сделать, это объявить функции как static inline
Это сообщит компилятору, что вы хотите, чтобы ваша функция была встроенной, и - если компилятор решит встроить ее - никакой статической версии той же функции не требуется. Это компилятор не может встроить функцию, он будет гарантировать, что функция является статической, например, имя функции является локальным по отношению к C-файлу, и никакие конфликты имен во время компоновки программы не произойдут.
Подсказка:
Компиляторы ведут себя по-разному. Если вы хотите скомпилировать код на другой платформе в будущем, убедитесь, что вы скрыли определение в макросе.
Например, я должен использовать static inline
для GCC и Visual Studio и простой _inline
для TSP Code Composer DSP / встроенного ARM-компилятора. Более поздний компилятор не понимает простой inline, потому что он нестандартный и не будет понимать static _inline.