У меня есть много исходных файлов C (и.c и.h файлы). заголовочные файлы содержат много функций. Из тех функций, только частично используются в источнике.C файл. Предположим, что a.h, b.h являются заголовочными файлами и a.c, и b.c являются.c файлами. a.h включен в a.c. Но только много функций, это находится в a. h, используются, и отдых не используются. После компиляции я нахожу соблюдающие предупреждения:
function XXXX defined but not used.
Но те XXXX функций, которые не используются в a.c, используются в до н.э. Так, я не могу полностью удалить те функции также. Так, я решил сделать отдельный файл, содержащий только те XXXX функций, и включал его везде, где он используется. Выполнение этого создает несколько количество заголовочных файлов. Может кто-либо предлагать меня некоторому эффективному способу решить эту проблему.
Предупреждение «Функция определена, но не используется» выдается только для функций с внутренней связью , то есть функций, которые объявлены как статические
. Эти функции доступны только в одной единице трансляции, поэтому компилятор всегда знает, используются они (в программе) или нет. Если вы не ссылаетесь на эти функции в их единицах перевода, известно, что эти функции не используются, и выдается предупреждение.
Вы говорите, что эти функции «не используются в a.c, но используются в b.c». Это неправда. Когда вы объявляете (и определяете) функцию как static
в файле заголовка, каждая единица перевода, которая включает этот файл заголовка, получает свою собственную внутреннюю копию функции. Хотя эти функции выглядят абсолютно одинаково, они по-прежнему являются отдельными, полностью независимыми функциями. Тот факт, что они имеют одинаковое имя и состоят из одного и того же кода, ничего не значит для компилятора. Итак, в b.c
у вас есть полностью независимая копия функции, которая используется (как вы говорите), но полностью независимая копия в a.c
все еще не используется.
В данном случае возникает вопрос , почему вы это делаете.Почему вы определяете статические функции в файле заголовка? Если вам действительно нужно это сделать (т.е. если вы действительно хотите создать отдельный внутренний «клон» этой функции в каждой единице перевода), вы можете обойти предупреждение, используя некоторые средства, специфичные для компилятора. Как и в GCC, например, вы можете объявить функцию с помощью __ attribute __ ((unused))
, и предупреждение для этой функции больше не будет выдаваться.
Но обычно не нужно определять функции в файле заголовка. Обычно можно использовать функцию с внешней связью (т.е. без static
), определить ее в одном из файлов .c и поместить объявление (прототип) в файл заголовка. В этом случае компилятор не выдаст никаких предупреждений, даже если функция объявлена, но не используется в какой-либо единице перевода.
Если вы просто хотите скрыть предупреждение, используйте:
-Wno-unused-function
Однако, вероятно, вам стоит последовать совету из ответа caf's answer. Похоже, что вы определили функцию, хотя хотели добавить только ее объявление.
Похоже, ваша проблема в том, что вы определяете функции в файлах .h
. Не делай этого. Вместо этого просто поместите свои объявления в файл .h
и получите соответствующий файл .c
, содержащий определения функций:
common.h:
#ifndef _COMMON_H
#define _COMMON_H
int foo(int a, int b);
int bar(double x, double y, double z);
#endif /* _COMMON_H */
common.c:
#include "common.h"
int foo(int a, int b)
{
/* code */
}
int bar(double x, double y, double z)
{
/* code */
}
Затем ваши ac
и bc
должны #include "common.h"
, и вам нужно будет организовать скомпилировать common.c
в полную программу.