Функция, определяемая, но не используемое предупреждение в C

У меня есть много исходных файлов 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 функций, и включал его везде, где он используется. Выполнение этого создает несколько количество заголовочных файлов. Может кто-либо предлагать меня некоторому эффективному способу решить эту проблему.

31
задан Matthew Flaschen 16 May 2010 в 22:43
поделиться

3 ответа

Предупреждение «Функция определена, но не используется» выдается только для функций с внутренней связью , то есть функций, которые объявлены как статические . Эти функции доступны только в одной единице трансляции, поэтому компилятор всегда знает, используются они (в программе) или нет. Если вы не ссылаетесь на эти функции в их единицах перевода, известно, что эти функции не используются, и выдается предупреждение.

Вы говорите, что эти функции «не используются в a.c, но используются в b.c». Это неправда. Когда вы объявляете (и определяете) функцию как static в файле заголовка, каждая единица перевода, которая включает этот файл заголовка, получает свою собственную внутреннюю копию функции. Хотя эти функции выглядят абсолютно одинаково, они по-прежнему являются отдельными, полностью независимыми функциями. Тот факт, что они имеют одинаковое имя и состоят из одного и того же кода, ничего не значит для компилятора. Итак, в b.c у вас есть полностью независимая копия функции, которая используется (как вы говорите), но полностью независимая копия в a.c все еще не используется.

В данном случае возникает вопрос , почему вы это делаете.Почему вы определяете статические функции в файле заголовка? Если вам действительно нужно это сделать (т.е. если вы действительно хотите создать отдельный внутренний «клон» этой функции в каждой единице перевода), вы можете обойти предупреждение, используя некоторые средства, специфичные для компилятора. Как и в GCC, например, вы можете объявить функцию с помощью __ attribute __ ((unused)) , и предупреждение для этой функции больше не будет выдаваться.

Но обычно не нужно определять функции в файле заголовка. Обычно можно использовать функцию с внешней связью (т.е. без static ), определить ее в одном из файлов .c и поместить объявление (прототип) в файл заголовка. В этом случае компилятор не выдаст никаких предупреждений, даже если функция объявлена, но не используется в какой-либо единице перевода.

70
ответ дан 27 November 2019 в 21:34
поделиться

Если вы просто хотите скрыть предупреждение, используйте:

-Wno-unused-function

Однако, вероятно, вам стоит последовать совету из ответа caf's answer. Похоже, что вы определили функцию, хотя хотели добавить только ее объявление.

8
ответ дан 27 November 2019 в 21:34
поделиться

Похоже, ваша проблема в том, что вы определяете функции в файлах .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 в полную программу.

4
ответ дан 27 November 2019 в 21:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: