Функции, объявленные static
в файле .c
, видны / могут использоваться только в этом файле.Если они не используются в нем, то это фактически мертвый код, и компилятор предупреждает вас об этом факте.В GCC вы можете использовать атрибут функции unused
для подавления этого предупреждения:
static int __attribute__((unused)) function1() {
...
}
РЕДАКТИРОВАТЬ:
В общем случае вы должны следовать следующим рекомендациям относительно встроенногофункции:
Если они используются в нескольких файлах C, объявите их static
и определите их во включенном заголовочном файле.Это позволяет всем .c
файлам, содержащим этот заголовок, иметь собственное личное определение функции, что позволяет компилятору встроить ее.Одинокая static
функция прототипы практически не имеют смысла в заголовочном файле, который будет использоваться несколькими исходными файлами, поскольку их фактические определения будут отсутствовать.
Если они не предназначены для повторного использования, укажите их определение (и, при необходимости, их прототип) в файле .c
, где они должны использоваться.
Если GCC жалуетсяо невозможности встроить функцию из-за размера функции:
Спросите себя, нужна ли вам действительно эта функция для встроенной функции - по моему опыту, компиляторобычно знает лучше.
Если вы действительно хотите, чтобы эта функция была встроенной, атрибут функции always_inline
может быть полезен.Возможно, вам также придется предоставить нестандартную -finline-limit=n
опцию для GCC, чтобы увеличить допустимый размер для встроенных функций.
См. Также this для получения дополнительной информации о встроенных функциях и некоторых возможных подводных камнях, касающихся их использования.
РЕДАКТИРОВАТЬ 2:
Если у вас есть функция static inline
, определенная в общем заголовочном файле, и вы хотите включить еев обычную, из-за отсутствия лучшего слова, функцию вы должны:
Выбрать файл .c
, в котором наличие этой функции имеет смысл (то есть поместить его вместе с другими связанными функциями).
Удалите ключевые слова static
и inline
из его определения и переместите определение из заголовка в этот файл.
Удалите ключевые слова static
и inline
из его прототипа и поместите его в файл заголовка.
Поздравляем, теперь у вас естьобычная общедоступная функция.
Отказ от ответственности: вы только что сделали функциюон был закрыт для нескольких файлов, public для всей вашей программы.Если есть другой открытый символ - переменная или функция - с тем же именем, вы можете получить ошибки при компоновке или даже странное поведение во время выполнения.Вы были предупреждены ...