Нет предыдущего прототипа для функции BOOL: areIntsDifferent (int thing1, int thing2) и NSString * boolString (BOOL yesNo) - PullRequest
2 голосов
/ 02 апреля 2012

Я получил этот код из книги, но не смог заставить его работать.В чем моя проблема здесь?Как видно из заголовка

"Предыдущий прототип для функции BOOL отсутствует: areIntsDifferent (int thing1, int thing2) и NSString * boolString (BOOL yesNo)"

#import <Foundation/Foundation.h>

BOOL areIntsDifferent (int thing1, int thing2 ) {
    if ( thing1 == thing2) {
        return (NO);
    }
    else {
        return (YES);
    }
}    

NSString * boolString (BOOL yesNo) {
    if (yesNo== NO) {
        return (@"NO");
    }
    else {
        return (@"YES");
    }    
} 

int main (int argc, const char * argv[]) {
    BOOL aretheydiffrent;
    aretheydiffrent = areIntsDifferent (5,5);
    NSLog(@"are %d and %d diffrent? %@", 5, 5, boolString(aretheydiffrent));
    aretheydiffrent = areIntsDifferent(23,42);
    NSLog(@"are %d and %d diffrent? %@", 23, 42, boolString(aretheydiffrent));
    return 0;
}

Ответы [ 3 ]

3 голосов
/ 02 апреля 2012

Сообщение об ошибке переводится в:

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

Создание функций static должно отсортировать это:

#import < Foundation/Foundation.h >

static BOOL areIntsDifferent (int thing1, int thing2 )
{
     return thing1 != thing2;
}

static NSString * boolString (BOOL yesNo)
{
    return yesNo ? @"YES" : @"NO";

}

int main (int argc, const char * argv[])

{
   BOOL aretheydiffrent;

   aretheydiffrent = areIntsDifferent (5,5);

   NSLog(@"are %d and %d diffrent? %@",
      5, 5, boolString(aretheydiffrent));

   aretheydiffrent = areIntsDifferent(23,42);

   NSLog(@"are %d and %d diffrent? %@",
      23, 42, boolString(aretheydiffrent));

   return 0;
}
1 голос
/ 07 сентября 2012

Во-первых, мы не должны использовать static, во-вторых, мы не должны использовать '==' в цели c (oc), когда мы используем bool, потому что в oc числа записываются во внутреннюю память, как это 0000 0000, поэтому '5'читать как 0000 00021, а '23' читать как '0001 0111' '42' в oc, компьютер может считать 23 как 5, что неправильно.По той же причине мы не должны использовать == да

Вот пример:

NSLog(@"%d  %d",YES,NO);
if(areIntsDifferent_faulty(23, 5)==YES)
{
   NSLog(@"Are %d and %d different? %d YES",23,5,areIntsDifferent_faulty(23, 5));
}
else {
    NSLog(@"Are %d and %d different? %d NO",23,5,areIntsDifferent_faulty(23, 5));
}

if(areIntsDifferent_faulty(23, 5))
{
    NSLog(@"Are %d and %d different? %d YES",23,5,areIntsDifferent_faulty(23, 5));
}
else {
    NSLog(@"Are %d and %d different? %d NO",23,5,areIntsDifferent_faulty(23, 5));
}

Вывод: 5 и 5 различны?нет 23 и 42 разные? да 1 0 это 23 и 5 разные?18 нет 23 и 5 разные?18 да

так напишите так: если (areIntsDiffreent_faulty (23,5)) это правильно!

0 голосов
/ 02 апреля 2012

Прототип функции - это, по сути, «сигнатура» функции: каково ее имя, что она возвращает, каковы ее аргументы и т. Д. Тело функции - это то, что функция фактически делает, и то, что содержится в фигурных скобках.функции.

Прототип:

BOOL areIntsDifferent(int thing1, int thing2);

Тело:

BOOL areIntsDifferent(int thing1, int thing2)
{
    return (thing1 != thing2);
}

Скорее всего, вы получаете толькопредупреждение о компиляции, а не ошибка (предупреждения просто говорят вам что-то, и ваша программа может все еще работать, ошибки фактически останавливают показ).Прототипы функций очень полезны в больших проектах и ​​обычно содержатся в отдельном файле, называемом заголовком.Я не знаю, какая у вас книга, но вы, вероятно, узнаете об этом позже.

Существует два возможных исправления:

  • Добавьте следующие строкив начало файла, после #import ...

    BOOL areIntsDifferent(int thing1, int thing2);NSString* boolString(BOOL yesNo);

  • Отключите предупреждение «Prototypes отсутствующих функций» в настройках конфигурации вашего проекта XCode.

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

Первое исправление напоминает «Я слышу вас, спасибо, что напомнили мне, мистер Компилятор».Второе исправление - что-то вроде «Заткнись компилятор, я большой мальчик, и мои функции находятся там, где я хочу!»

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