При использовании gcc
или clang
обычно рекомендуется включить несколько предупреждений, а первая партия предупреждений обычно предоставляется -Wall
. Этот пакет довольно большой и включает в себя заданное c предупреждение -Wunused-function
.
Теперь -Wunused-function
полезно для обнаружения static
функций, которые больше не вызываются, то есть они бесполезны и должны поэтому желательно удалить из исходного кода. При применении политики «нулевого предупреждения» она больше не «предпочтительна», но совершенно обязательна.
Из соображений производительности некоторые функции могут быть определены непосредственно в заголовочных файлах *.h
, чтобы их можно было встроить во время компиляции (не учитывая магию LTO c). Такие функции обычно объявляются и определяются как static inline
. В прошлом такие функции, вероятно, вместо этого можно было бы определять как макросы, но было бы лучше сделать их static inline
функциями вместо этого, когда это применимо (без смешных проблем с типами).
ОК, так что теперь у нас есть множество функций, определенных непосредственно в заголовочные файлы, по соображениям производительности. Блок, включающий такой заголовочный файл, не обязан использовать все свои объявленные символы. Следовательно, функция static inline
, определенная в заголовочном файле, может не вызываться.
Для gcc
это нормально. gcc
будет обозначать неиспользуемую static
функцию, но не inline static
. Для clang
, однако, результат будет другим: функции static inline
, объявленные в заголовках, вызывают предупреждение -Wunused-function
, если один модуль не вызывает их. И для этого не нужно много флагов: достаточно -Wall
.
Обходное решение - ввести расширение c, определяемое компилятором, такое как __attribute__((unused))
, которое явно заявляет компилятору, что функция, определенная в заголовке, не обязательно вызывается всеми ее модулями. Хорошо, но теперь код, который раньше был чистым C99
, включает некоторую форму специфического расширения компилятора c, добавляя вес переносимости и обслуживания.
Поэтому вопрос больше о логике c такого выбора: почему clang
выбирает для запуска предупреждения, когда не вызывается функция static inline
, определенная в заголовке? В каком случае это хорошая идея?
И что clang
предлагает охватить относительно общий случай встроенных функций, определенных в заголовочном файле, без запроса использования расширения компилятора?
edit : После дальнейшего исследования выясняется, что вопрос неверен. Предупреждение вызывается в редакторе (VSCode) с использованием clang
linter с применением выбранных флагов компиляции списка (-Wall
, et c.). Но когда исходный код фактически скомпилирован с clang
и с точно таким же списком флагов, предупреждение «неиспользуемая функция» отсутствует.
До сих пор результаты, видимые в редакторе, были в точности теми, которые были найдены во время компиляции. Это первый раз, когда я вижу разницу.
Таким образом, проблема, похоже, связана с тем, как линтер использует clang
для составления списка предупреждений. Это гораздо более сложный и конкретный c вопрос.
Обратите внимание на комментарий :
ОК, извините, это на самом деле отличается от ожидания , Похоже, что предупреждение вызывается в редакторе с использованием clang
linter с выбранными флагами компиляции (-Wall
, et c.). Но когда исходный код скомпилирован с точно такими же флагами, предупреждение «неиспользуемая функция» фактически отсутствует. До сих пор результаты, видимые в редакторе, были точно такими же, какие были найдены во время компиляции; это первый раз, когда я вижу разницу. Таким образом, проблема, похоже, связана с тем, как линтер использует clang
для создания своего списка предупреждений. Кажется, это более сложный вопрос [чем я понял].