В чем разница между #import и #include в Objective-C?

Как говорится в сообщении об ошибке, локальные переменные, на которые ссылается выражение lambda, должны быть окончательными или фактически окончательными («эффективно окончательный», что означает, что компилятор может сделать его окончательным для вас).

Простой обходной путь:

for(i = 0; i < 10; i++) {
    final int ii = i;
    button[i].setOnAction( ae -> { button[ii].setDisable(true) } );
}
379
задан Ryan Guill 14 January 2009 в 02:25
поделиться

5 ответов

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

В основном, Вам решать который Вы хотите использовать. Я ухаживаю к #import заголовкам для вещей Objective C (как определения классов и такой) и #include стандарт C за материалом, в котором я нуждаюсь. Например, один из моих исходных файлов мог бы быть похожим на это:

#import <Foundation/Foundation.h>

#include <asl.h>
#include <mach/mach.h>
337
ответ дан Reto Koradi 14 January 2009 в 02:25
поделиться

#include работы точно так же, как C #include.

#import отслеживает, которых были уже включены заголовки, и проигнорирован, если заголовок импортируется несколько раз в единице компиляции. Это делает ненужным использовать защиту заголовка.

нижняя строка является просто использованием #import в Objective C, и не волнуйтесь, завершают ли Ваши заголовки импорт чего-то несколько раз.

22
ответ дан Ferruccio 14 January 2009 в 02:25
поделиться

#import директива, используемая Objective-C, почти идентична классику #include механизм, который она наследовала от C язык программирования. Единственная разница - то, что это удостоверяется, что тот же файл никогда не включается несколько раз. Это - маленькое удобство избежать общего C метод включения защиты заголовка для preprocessor.

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

  1. #import отслеживает, которых были уже включены заголовки, и проигнорирован, если заголовок импортируется несколько раз в единице компиляции. Это делает ненужным использовать защиту заголовка.

  2. При использовании #import, заголовок включает защиту, является ненужным. Иначе, it’s точно так же, как #include.

  3. #include позволяют Вам много раз включать тот же файл.

Компиляция файла в Objective C сделана в двух передачах. Во-первых, препроцессор пробегает файл. Вывод от препроцессора входит в реальный компилятор.

Использование @import вместо этого

1
ответ дан 4 October 2019 в 00:45
поделиться

#include он использовал для получения "вещей" из другого файла в тот, в котором используется #include . Пример:

в файле: main.cpp

#include "otherfile.h"

// some stuff here using otherfile.h objects,
// functions or classes declared inside

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

в файле: otherfile.h

#ifndef OTHERFILE
#define OTHERFILE

// declare functions, classes or objects here

#endif

, даже если вы поместите #include "otherfile.h" n раз в свой код, это внутри него не будет повторно объявлено.

0
ответ дан 22 November 2019 в 23:53
поделиться

Если вы #include файл два раза в .h файлах, то компилятор выдаст ошибку. Но если вы #импортируете файл более одного раза, компилятор проигнорирует его.

1
ответ дан 22 November 2019 в 23:53
поделиться