Почему в этом небольшом образце я не получил «никакого предыдущего прототипа для функции»? - PullRequest
15 голосов
/ 04 сентября 2011

У меня очень простой пример 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;
}

С этим кодом я получаю предупреждение «нет предыдущего прототипа для функции» для littleFunction, но, как вы все можете видеть, перед main есть объявление. Что здесь не так? Кажется, компилятор не может сопоставить объявление с реализацией функции.

Если я поменяю оба так:

int littleFunction(void)

работает отлично. Я использую последнюю версию Xcode 4

Ответы [ 2 ]

36 голосов
/ 04 сентября 2011

В C int littleFunction(); не является на самом деле прототипом.Он не указывает, сколько (или какого рода) параметров принимает функция.

Фактическая формулировка в C99 приведена в §6.7.5.3, элемент 14:

Список идентификаторовобъявляет только идентификаторы параметров функции.Пустой список в деклараторе функции, который является частью определения этой функции, указывает на то, что функция не имеет параметров. пустой список в объявителе функции , который не является частью определения этой функции , указывает, что никакой информации о количестве или типах параметров не предоставляется . 124

Сноска ссылается на этот раздел в Будущие направления языка :

6.11.6 Функцияобъявители
Использование объявлений функций с пустыми скобками (не объявители типа параметров в формате прототипа) является устаревшей функцией.

(Примечание: это все еще присутствует в черновике C11 Ihave (n1570).)

Назад в §6.7.5.3, позиция 10:

Особый случай безымянного параметра типа void в качестве единственного элемента в спискеуказывает, что функция не имеет параметров.

Таким образом, вы должны явно указать int foo(void);, если хотите создать прототип функции, которая не принимает параметры.Objective-C имеет те же правила.

3 голосов
/ 03 февраля 2012

Я думаю, проблема в том, что вы не использовали "static" для global функции.

Пожалуйста, обратитесь к следующему:

нет предыдущего прототипа для `foo '

Это означает, что GCC нашел глобальное определение функции, не увидев прототипа для функции.Если функция используется более чем в одном файле, в заголовочном файле должен быть прототип для нее.Это предохраняет функции и их использование от синхронизации

Если функция используется только в этом файле, сделайте ее static , чтобы гарантировать, что она никогда не будет использоваться вне этого файла и документачто это локальная функция

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...