Почему в этом маленьком образце я не получаю "предыдущий прототип функции"?
У меня очень простой образец Objective-C
#import <Foundation/Foundation.h>
int littleFunction();
int main (int argc, const char * argv[])
{
NSAutoreleasePool * pool
= [[NSAutoreleasePool alloc] init];
// insert code here...
NSLog(@"Hello, World!");
[pool drain];
return 0;
}
int littleFunction()
{
return 0;
}
С помощью этого кода я получаю предупреждение "no previous prototype for function" для littleFunction, но, как вы можете видеть, есть декларация перед main. Что здесь не так? Кажется, что компилятор не может сопоставить объявление с реализацией функции.
Если я изменил оба значения:
int littleFunction(void)
работает отлично.
Я использую последний Xcode 4
Ответы
Ответ 1
В C, int littleFunction();
на самом деле не прототип. Он не определяет, сколько (или каких) параметров принимает функция.
Фактическая формулировка на C99 приведена в пункте 6.7.5.3 пункта 14:
Список идентификаторов объявляет только идентификаторы параметров функции. Пустой список в объявлении функции, который является частью определения этой функции, указывает, что функция не имеет параметров. пустой список в деклараторе функций, который не является частью определения этой функции, указывает, что не указана информация о количестве или типах параметров. 124
Сноска относится к этому разделу в следующих языковых направлениях:
6.11.6 Объявление функций
Использование деклараторов функций с пустыми круглыми скобками (а не параметром прототипа тип деклараторы) является устаревшей особенностью.
(Примечание: это все еще присутствует в проекте C11, который у меня есть (n1570).)
В разделе 6.7.5.3, пункт 10:
Частный случай неименованного параметра типа void
как единственный элемент в списке указывает, что функция не имеет параметров.
Поэтому вам нужно явно указать int foo(void);
, если вы хотите прототипировать функцию, которая не принимает параметры. Objective-C имеет те же правила.
Ответ 2
Я думаю, проблема в том, что вы не использовали "статический" для глобальной функции.
Обратитесь к следующему:
нет предыдущего прототипа для `foo '
Это означает, что GCC обнаружил глобальное определение функции, не видя прототипа функции. Если функция используется более чем в одном файле, в файле заголовка должен быть прототип. Это предотвращает синхронизацию функций и их использования.
Если функция используется только в этом файле, сделайте ее static, чтобы гарантировать, что она никогда не будет использоваться за пределами этого файла и документирует ее локальную функцию