В качестве альтернативы «не делай этого» рассмотрим следующее - набор функций, который вызовет до трех предупреждений о неиспользованных функциях.
static int get_version_number(void) { return 42; }
static double hidden_global_variable(void) { return 3.14; }
static int potential_alternative_to_macro(int x) { return 4 * x; }
Напишите другую функцию, вероятно, на основе имени файла заголовка,
static void wno_unused_myheadername(void)
{
/* don't need to actually call the functions to avoid the warnings */
(void)&get_version_number;
(void)&hidden_global_variable;
(void)&potential_alternative_to_macro;
return;
}
Теперь мы подошли к одному предупреждению о неиспользованной функции. Если вы добавите вызов wno_unused_myheadername () в любую из функций extern, объявленных в файле, который содержит заголовок, весь набор предупреждений о неиспользуемых функциях исчезнет. Так как они теперь все используются.
Компилятор откажется где угодно от всех до неиспользуемых функций, включая wno_unused_myheadername, поскольку он может видеть все определения и, вероятно, может определить, что одиночный вызов функции wno_unused на самом деле ничего не делает.
Я проверил, что вышеизложенное удаляет предупреждения, как и ожидалось, в clang и gcc, ваш milage может отличаться в зависимости от других компиляторов. Я не смотрел на вывод asm, чтобы выяснить, когда удаляются почти неиспользуемые функции.
Что касается того, почему - хорошей причиной было бы использование множества небольших функций, которые хорошо подходят для встраивания в C89, у которых нет встроенного ключевого слова, без необходимости оптимизации времени компоновки у вашего компилятора.