Странное LLVM предупреждение: нет предыдущего прототипа для функции для - PullRequest
6 голосов
/ 14 января 2012

Если я пропустил прототип, XCode (LLVM) запросит у меня ошибку

нет предыдущего прототипа для функции для exceptionHandler

Но зачем они нужны в моем коде ниже?

void exceptionHandler(NSException * exception); // Why this Line is needed?

void exceptionHandler(NSException * exception)
{
    // ....
}

@implementation AppDelegate

- (void) applicationDidFinishLaunching:(UIApplication *)application
{
    NSSetUncaughtExceptionHandler(&exceptionHandler);
...

Ответы [ 4 ]

16 голосов
/ 19 января 2012

Из руководства GCC:

-Wmissing-прототипы (только C и Objective-C)

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

Clang заимствовал эту опцию для совместимости с GCC и потому, что она полезна (я бы предположил, что это разработчики Clang).

Опция существует, так что вы можете избежать частой ошибки, которой можно легко избежать.Для ясности / намерения полезно четко указывать видимость / связь.

Короче говоря, вы попросили компилятор сообщить вам, когда неполное определение не соответствует объявлению, включив эту опцию.Вы должны либо квалифицировать это как extern и сделать его пригодным для использования другими (например, поместить его в заголовок), либо объявить его static.Если использование C ++ inline также является опцией.

Конечно, неявная видимость хорошо известна, но я обычно нахожу опцию полезной в этих сценариях:

1) Я сделал опечатку:

// file.h
extern void MONExceptionHandler(NSException * exception);

и

// file.m
void MONExceptionhandler(NSException * exception) {
  …

2) Я должен четко указать видимость символа:

// file.m
static void MONExceptionHandler(NSException * exception) {
  …

3) Я забыл #include заголовок, которыйобъявлена ​​функция:

// file.h
extern void MONExceptionHandler(NSException * exception);

Предупреждение:

// file.m
void MONExceptionHandler(NSException * exception) {
  …

Нет Предупреждение:

// file.m
#include "file.h"

void MONExceptionHandler(NSException * exception) {
  …

Итак, есть обоснование, история и некоторые примеры - опять же, -Wmissing-prototypes - это опция .Если вы доверяете себе работать с отключенным, то сделайте это.Я предпочитаю быть явным и позволять программам обнаруживать потенциальные и реальные проблемы, чтобы мне не приходилось делать это вручную.

7 голосов
/ 14 января 2012

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

Таким образом, предупреждение, насколько я понимаю, пытается заставить вас прояснить свои намерения между статическими функциями и глобальными функциями и не рекомендует объявлять глобальную функцию, когда вы намеревались объявить только статическую.

0 голосов
/ 20 января 2012

Это предупреждение предупреждает, что вы не можете вызвать свой метод из другого метода, который написан выше. В C порядок объявления / реализации очень важен и дает разницу между тем, что вы можете получить или не можете получить.

0 голосов
/ 19 января 2012

Я думаю, что это наиболее полезно для кода C ++. Например, у меня есть заголовок

class MyClass {
public:
    void hello();
};

и файл .cpp

void hello() {
    cout << "hello";
}

И вы увидите предупреждение, потому что нет прототипа для функции void hello(). В случае, если правильная реализация должна быть

void MyClass::hello() {
    cout << "hello";
}

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

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