Является ли Objective-C ++ совершенно другим языком из Objective-C?

Как говорится в названии... считаются ли они разными языками? Например, если вы написали приложение с использованием комбинации С++ и Objective-C ++, вы бы считали, что это было написано на С++ и Objective-C, С++ и Objective-C ++ или на всех трех?

Очевидно, что C и С++ - разные языки, хотя С++ и C напрямую совместимы, как ситуация с Objective-C ++ и Objective-C?

Ответы

Ответ 1

Objective-C ++ просто позволяет смешивать Objective-C и код С++ (с оговорками). Это не само по себе язык, а механизм, позволяющий смешивать два языка.

Ответ 2

От: http://en.wikipedia.org/wiki/Objective-C#Objective-C.2B.2B

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

  • Класс С++ не может быть получен из класса Objective-C и наоборот.
  • Пространства имен С++ не могут быть объявлены внутри объявления Objective-C.
  • Objective-C классы не могут иметь переменные экземпляра классов С++, которые не имеют конструктора по умолчанию или которые имеют один или несколько виртуальных методов, но указатели на объекты С++ могут использоваться как переменные экземпляра без ограничений (назначьте их новым в -init).
  • С++ "по значению" семантика не может применяться к объектам Objective-C, доступ к которым возможен только через указатели.
  • Объявление Objective-C не может быть в объявлении шаблона С++ и наоборот. Однако типы Objective-C (например, Classname *) могут использоваться как параметры шаблона С++. Objective-C и обработка исключений С++ различна; обработчики каждого из них не могут обрабатывать исключения другого типа.
  • Следует соблюдать осторожность, поскольку соглашения о вызове деструктора из Objective-C и С++ исключаемых моделей времени выполнения не совпадают (т.е. деструктор С++ не будет вызываться, когда исключение Objective-C выходит из области объектов С++). Новая 64-битная среда выполнения разрешает это путем введения совместимости с исключениями С++ в этом смысле

Ответ 3

C и С++ напрямую не совместимы. Также не является надмножеством другого (хотя большинство C является допустимым С++). Objective-C является строгим надмножеством C, а Objective-C ++ является строгим надмножеством С++. Это единственные утверждения, которые вы можете сделать (за исключением тривиально меняющего его).

Ответ 4

Трудно ответить на этот вопрос уверенно, не понимая, какое определение "другого языка" вы хотите применить.

Objective-C является надмножеством C: он добавляет дополнительный синтаксис поверх языка C. Objective-C ++ является надмножеством С++ таким же образом.

C и С++ - фактически разные языки. Хотя С++ предназначен для совместимости, существует C, который не является допустимым С++ и наоборот.

Итак, я бы сказал, да, Objective-C ++ - это другой язык из Objective-C, потому что С++ - это другой язык из C. Однако я бы не назвал их совершенно разными.

Ответ 5

Objective-C, вероятно, является официальным термином, который вы бы вложили в резюме.

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

Ответ 6

На первый взгляд, использование диалекта Objective-C ++ выглядит как простой подход. Это результат слияния С++ и Objective-C вместе в одном компиляторе, а надежные реализации существуют в GCC и теперь clang. Учитывая, насколько различны детали Objective-C и С++, хакеры GCC отлично справились с этим. Но по мере того, как вы начинаете переименовывать ваши .m файлы в .mm, чтобы представить куски С++, вы быстро понимаете, что это не так просто.

Заголовочные файлы и препроцессор C в целом вызвали головные боли для программистов C, С++ и Objective-C на протяжении десятилетий. Когда вы пытаетесь смешивать языки, становится все хуже. Предположим, вы хотели использовать STL-карту в классе Objective-C в вашем проекте. Библиотеки Apple Foundation, насколько мне известно, не содержат сортированную, основанную на деревьях карту; один из наших компонентов StyleKit нуждается именно в этом, например. Поэтому мы просто создаем переменную экземпляра для карты в нашем классе, и мы уходим:

#include <map>
@interface MyClass : NSObject {
 @private
 std::map<int, id> lookupTable;
} 
 // ...
@end

Однако std:: map [2] имеет смысл только для компилятора, поддерживающего С++, и только после #include [3], поэтому этот заголовок теперь может быть #imported из файлов Objective-C ++. Любой код, использующий этот класс, теперь должен быть преобразован в Objective-C ++ сам, а импорт из других заголовков приводит к каскадному эффекту, который быстро охватывает весь проект.

В некоторых случаях это может быть приемлемым. Однако переключение целого проекта или его больших частей только для того, чтобы ввести библиотеку, которая используется в одном месте, не только чрезмерна; если вы единственный, кто знает С++ в проекте с несколькими программистами Objective-C, вы можете обнаружить, что это непопулярная идея. Это также может вызвать проблемы таким же образом, что компиляция чистого C-кода с помощью компилятора С++ редко бывает без проблем. Более того, это означает, что код не может автоматически использоваться повторно в других проектах Objective-C.

Так что всегда лучше не смешивать, если это так важно

Чтобы узнать больше о стратегиях использования объектного С++ в объекте c и наоборот, нажмите здесь