Краткое описание того, как файлы .h и .m взаимодействуют в цели c? - PullRequest
24 голосов
/ 12 апреля 2010

Я только начал изучать цель C и очень растерян, как файлы .h и .m взаимодействуют друг с другом. Эта простая программа имеет 3 файла:

Fraction.h

 #import <Foundation/NSObject.h>
    @interface Fraction : NSObject {
        int numerator;
 int denominator;
    }
    - (void) print;
    - (void) setNumerator: (int) n;
    - (void) setDenominator: (int) d;
    - (int) numerator;
    - (int) denominator;
    @end

Fraction.m

 #import "Fraction.h"
    #import <stdio.h>
    @implementation Fraction
    -(void) print { printf( "%i/%i", numerator, denominator ); }
    -(void) setNumerator: (int) n { numerator = n; }
    -(void) setDenominator: (int) d { denominator = d; }
    -(int) denominator { return denominator; }
    -(int) numerator { return numerator; }
    @end

main.m

 #import <stdio.h>
    #import "Fraction.h"
    int main(int argc, char *argv[]) {
        Fraction *frac = [[Fraction alloc] init];
 [frac setNumerator: 1];
 [frac setDenominator: 3];
 printf( "The fraction is: " );
 [frac print];
 printf( "\n" );
 [frac release];
 return 0;
    }

Из того, что я понимаю, программа изначально запускает файл main.m. Я понимаю базовые концепции языка Си, но вся эта «классовая» и «экземплярная» вещь действительно сбивает с толку. В файле Fraction.h @interface определяет числитель и знаменатель как целое число, но что еще он делает ниже с (void)? и какова цель переопределения ниже? Я также весьма озадачен тем, что происходит с (void) и (int) частями Fraction.m и как все это объединено в файле main.m. Я думаю, что я пытаюсь сказать, что это довольно простая программа, чтобы узнать, как разные части работают друг с другом - кто-нибудь может объяснить на нетехнологическом жаргоне?

Ответы [ 5 ]

63 голосов
/ 12 апреля 2010

Люди, пришедшие из других сред, всегда полагают, что с файлами .c, .m и .h, используемыми в программировании на C и Objective-C, происходит нечто сложное.

На самом деле, это очень, ОЧЕНЬ просто.

В целях создания проекта интегрированные среды разработки, такие как XCode, игнорируют все файлы .h. Что они делают, так это берут каждый файл .c и .m и компилируют его. Если программист (то есть вы) использовал какие-либо директивы #include или #import, компилятор вставляет весь текст включенного / импортированного файла .h, где директива была.

Итак, если у вас есть файл .h - insert.h - там написано:

in

И файл .c, который сказал:

Alice
#include "insert.h"
Wonderland

Компилятор, после обработки директив #include & #import, увидит это:

Alice
in
Wonderland

Именно это ОЧЕНЬ простое поведение слияния файлов мы используем для создания сложных программ:)

.h - это просто соглашение, согласно которому программисты могут сообщать друг другу, что файл подходит для объединения - возможно, несколько раз - с использованием #include или # import.

.c и .m файлы не объединяются таким образом. Каждый файл .c и .m компилируется отдельно - для создания файлов .o. Каждый файл .o представляет собой набор скомпилированных функций. Затем файлы .o объединяются - или «связываются» - для создания окончательной программы. Шаг связывания гарантирует, что каждая функция существует только один раз, и что все вызываемые функции действительно где-то существуют.

C & Objctive-C определяет одну специальную функцию, которая должна где-то существовать - main(). Опять же, язык очень расслаблен - ему все равно, в каком файле .c или .m находится функция main(). Просто, что она где-то существует в каком-то файле.

13 голосов
/ 12 апреля 2010

Вам нужно взглянуть на Объектно-ориентированное программирование и, возможно, прочитать немного больше о разработке Objective-C, чтобы хорошо понять концепции ООП и т. Д.

Чтобы ответить на ваш вопрос «в чем разница между файлами .h и .m», файлы .h содержат объявление для вашего класса, поэтому в основном все атрибуты и методы, которые он может использовать. Файл .m является реализацией этих методов.

С точки зрения непрофессионалов, заголовочный файл (.h) - это способ сказать «Это то, что я могу сделать», а .m - «Вот как я это делаю». Хотя это немного сложнее, чем это.

6 голосов
/ 12 апреля 2010

Файлы вообще не взаимодействуют, их использование - просто соглашение, вы также можете поместить все в файл main.m.

Хорошей отправной точкой для изучения Objective-C является введение в язык Objective-C .

0 голосов
/ 09 апреля 2013

Приведенные ниже строки кода в Fraction.h - не что иное, как методы получения. Они не переопределяют две переменные типа int, объявленные над ними.

- (int) numerator;
- (int) denominator;
0 голосов
/ 12 апреля 2010

В двух словах, класс Objective-C - это структура C. Экземпляр - это ссылка на такую ​​структуру, которая была выделена в памяти. У класса есть имя, а у экземпляра - состояние или значение.

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

Есть много других тонкостей в объектах Objective-C, таких как подсчет ссылок, но суть вызова методов по имени. SEL является строкой C, но строка C не является SEL.

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

Исполняемый файл C и, следовательно, исполняемый файл Objective-C, имеет точку входа в основную функцию. По соглашению main определяется в файле с тем же именем в проектах Objective-C.

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