предупреждение gcc: функция используется, но не определена - PullRequest
16 голосов
/ 03 апреля 2011

Я получаю предупреждение: function used but not defined.У меня есть static __inline__ в заголовочном файле сказать a.h.Заголовочный файл включен в a.c.Я хотел бы поместить все те встроенные функции, которые есть в заголовочных файлах, в файлы .c.Следующий код дает представление о моей проблеме.

Оригинальный код:

ах:

static __inline__ function1(){
    function definition;  
}

Я изменил:
ах:

static function1();

ac:

#include "a.h"

static function1(){
   function definition;
}

При выполнении вышеизложенного я получил предупреждение:

   warning: function function1 is used but not defined. 

Не могли бы вы дать мне знать, почему я получаю такое предупреждение?Я хотел бы перенести все функции __inline__ в .c, чтобы я не получил предупреждение:

  warning: function1 is could not be inlined, code size may grow.

Заранее спасибо

Ответы [ 3 ]

42 голосов
/ 03 апреля 2011

Вы объявили функцию статической.Это означает, что он виден только внутри текущего модуля компиляции.Другими словами: реализация видна только внутри файла a.c.Вам нужно удалить ключевое слово static как в a.h, так и a.c, чтобы другие файлы .c могли видеть функцию.Вы должны указать возвращаемое значение, например, void function1();, потому что оно неявно равно int, если вы его не указали.

8 голосов
/ 03 апреля 2011

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

3 голосов
/ 03 апреля 2011

Объявите функцию как обычно в заголовочном файле

хиджры

#ifndef A_H_INCLUDED
#define A_H_INCLUDED

void function1(void);

#endif

Определить функцию в одном файле кода без static

a.c

#include "a.h"

void function1(void) {
  /* function definition */
}

и вызов функции из других файлов после включения заголовка

b.c

#include "a.h"

void quux(void) {
  function1(); /* call regular function */
}

То, что вы делали раньше (static и реализация в заголовочном файле), работало, потому что каждый файл кода, включающий этот заголовок, получил свою собственную версию функции; отличается от любой другой функции с тем же именем в любом другом файле (но делает точно так же).

...