Подтвердить что ты не робот

Почему в этом маленьком образце я не получаю "предыдущий прототип функции"?

У меня очень простой образец 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

4b9b3361

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