Простой автономный файл Objective C - PullRequest
1 голос
/ 17 сентября 2011

Я пытаюсь пробежать всю цель C, которую я, возможно, могу как можно быстрее для моей новой работы. Я разделил свои тренировки, поэтому я делаю 1/2 с уроками по какао, и я подумал, что также имеет смысл попытаться выучить Цель C с общей точки зрения, поэтому остальные 50% я пытаюсь извлечь из " Книга "Программирование в объективе C" Стефана Кочана (2004). Многие из его примеров до первых 50 страниц или около того, похоже, подразумевают, что есть способ сделать простой класс (интерфейс, реализацию и основной) все в одном файле. Я пытался скомпилировать это в терминале Mac Snowleopard ради скорости, но как только я вызываю метод внутри основного я получаю ошибки компиляции.

Я знаю, что это не мой компилятор gcc, потому что файл будет компилироваться, и я даже могу написать оператор printf, но как только я пытаюсь вызвать метод, я получаю ошибки компиляции. Я был бы признателен, если бы кто-нибудь смог продемонстрировать простой включающий файл targetc.m, который на самом деле работает с вызовом метода.

вот мой код

#import <stdio.h>
#import <objc/Object.h>

@interface testing1 : Object
{
int number;
}

-(void) setNum:(int)a;
-(void) print;
@end

@implementation testing1;
-(void) setNum:(int) a{
number = a;
}


-(void) print{

printf("this is the number %i \n", number);

}

@end

int main(int argc, char* argv[] )
{
//testing1 *test =[testing1 new];
//[test setNum: (int)34];
printf("testing");
//[test print];
}

это скомпилируется в терминале с помощью --- gcc tester1 -o myProg -l objc Я пытался вызывать эти методы несколькими разными способами, но он не работает

любая помощь приветствуется. Возможно, мне нужно разбить его и использовать make - я не знаю Спасибо Майк

Ответы [ 3 ]

2 голосов
/ 17 сентября 2011

Книга, которую вы читаете, устарела. Класс Object фактически устарел еще в 1994 году с введением OpenStep .

В Objective-C 2.0 класс Object просто недоступен вообще. Вот почему ваша программа выдает предупреждения / ошибки компилятора.

Вместо этого следует создать подкласс NSObject и импортировать <Foundation/Foundation.h>. Используйте параметр -framework Foundation gcc вместо -l objc.

2 голосов
/ 17 сентября 2011

У вас есть ; в конце @implementation -

@implementation testing1;  // Semi colon shouldn't be present at the end

После внесения этого изменения вы должны увидеть результат. Онлайн результат программы

[test setNum: (int)34];

Здесь типирование с 34 по int не нужно. Вы можете просто передать сообщение setNum для ссылки test с 34, за которым следует двоеточие.

[test setNum:34 ];

Объявления интерфейса должны идти в заголовке при реализации в исходные файлы. Компилируются только исходные файлы. Еще до фазы компиляции препроцессор просто копирует содержимое всех импортированных файлов в единицы перевода. Итак,

testing.h

#import <Foundation/NSObject.h>
@interface testing1 : NSObject
{
    int number;
}

-(void) setNum:(int)a;
-(void) print;
@end

testing.m

#import <stdio.h>
#import "testing.h"

// You should definitely import just stdio.h header here because of printf function usage
// testing.h also to be imported or else compiler doesn't know what is testing1.

@implementation testing1
-(void) setNum:(int) a{
    number = a;
}
-(void) print{    
    printf("this is the number %i \n", number);
}
@end

main.m

#import <stdio.h>
#import "testing.h"

int main(int argc, char* argv[] )
{
    testing1 *test =[testing1 new]; 
    [test setNum: 34];
    printf("testing");
    [test print];

     return 0;
}

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

gcc -o test testing.m main.m -framework Foundation

Выполнить -

./test
0 голосов
/ 17 сентября 2011

Прежде всего, вы использовали #import,Это нужно только тогда, когда вы используете только C.Удалите предложение и используйте его вместо этого.


#import <Foundation/Foundation.h>

Во-вторых, почему вы используете #import?«<» И «>» предназначены только для фреймворков.Если вы хотите импортировать другой файл, который вы создали, используйте вместо этого #import "Object.h".(Если вы не говорите о NSObject, вам не нужно ничего импортировать, потому что это является частью инфраструктуры Foundation.)

И, наконец, вы должны убрать точку с запятой после @implementation, поскольку это не нужно,

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