Z tego, co tam przeczytałem: Dlaczego Objective-C nie jest zbyt popularny poza społecznością Apple?
Objective-C jest nadzbiorem języka C (w rzeczywistości znacznie ściślej niż C ++), więc kwestia kompatybilności wstecznej nie pojawia się. Wszystko, co możesz zrobić w C, możesz zrobić w Objective-C.
Bycie w superserii jest binarne, jak ciąża. Obj-C jest nadzbiorem języka C, a C ++ nie.
Co rozumieją przez superset? W jaki sposób cel-C byłby bardziej zbliżony / wstecznie zgodny z C? W jaki sposób obiektywne C jest bardziej zgodne z filozofią C niż C ++?
Czy jakikolwiek program w C może być skompilowany bez modyfikacji przez kompilator z celem C (100% zgodność)?
Jest to bardziej kwestia projektowania i kompatybilności języka programowania niż wojny o to, który z nich jest lepszy.
źródło
Oznaczają ścisły nadzbiór. Każdy poprawny program w C skompiluje się za pomocą kompilatora Objective-C. Niektóre prawidłowe programy w C nie będą się kompilować za pomocą kompilatora C ++.
Oto prosty przykład:
int *foo = malloc(12);
Kompiluje się w C i Objective-C, ale nie w C ++. Oczywiście są też inne przykłady.
Wszystko - Objective-C jest ścisłym nadzbiorem C.
Tak.
źródło
Od samego początku C ++ został zaprojektowany jako „lepsze C”, naprawiając zaniedbania projektowe, zarówno rzeczywiste, jak i postrzegane, gdy autorzy C ++ przeszli przez język. Rezultatem tej decyzji projektowej było to
X
, że bycie poprawnym programem w C nie gwarantuje, żeX
będzie się kompilował, nie mówiąc już o uruchomieniu, podczas przetwarzania przez kompilator C ++. Zmiany dotyczyły takich podstawowych konstrukcji, jak literały łańcuchowe (stały sięconst char*
), przypisywanievoid
wskaźników, konwersje międzyenum
s i typami całkowitymi, semantyka operatorów przypisania złożonych i tak dalej.Co więcej, gdy pojawił się C99, funkcje, które przeszły do zaktualizowanego standardu C, zostały pominięte w zaktualizowanym standardzie C ++. Ponownie, bardzo ważne funkcje języka zostały pominięte - w szczególności wyznaczone inicjatory i tablice o zmiennej wielkości.
W przeciwieństwie do tego, Objective C został umieszczony jako nadzbiór języka C, wymagając, aby wszystkie prawidłowe programy w C były kompatybilne z kompilatorem Objective C.
źródło
int nil = 0; nil++;
nie kompiluje się jako Objective-C. Jaki jest problem, czy jest oczywistą rzeczą, że Objective-C udostępnia dostępne nagłówki, które po dołączeniu mogą złamać twój kod dokładnie tak, jak mogą to zrobić nagłówki C. Dlatego autor tego fragmentu nie powinien ich uwzględniać.„Cel-C jest nadzbiorem C” oznacza, że każdy poprawny program w C jest poprawnym programem Celu C (o tym samym znaczeniu).
To jest czasami powiedział, choć nie przez ekspertów C ++, C ++, który jest rozszerzeniem C. To nie jest dokładna, dlatego Twój cytat jest dokonanie wielkiego porównywania dwóch.
źródło
Cel C to zestaw wstecznie kompatybilnych rozszerzeń C. Jest to możliwe, ponieważ cechy celu C są rozgraniczone na dwa bardzo proste sposoby:
@
. Ten znak nie jest obecnie używany w języku C.[obj method:argument]
. W języku C nawiasy kwadratowe są używane w bardzo specyficzny sposób do indeksowania tablic, więc jest to niepoprawna składnia C. Rozszerzenia oparte na nieprawidłowej składni nie zmieniają znaczenia niczego, co jest poprawne w języku hosta.Tak łatwo zauważyć, że żaden program, który używa rozszerzeń Objective C, nie może być programem ściśle zgodnym z ISO C, bez względu na to, jak prosty. Ponadto każdy program ISO C można z definicji zadeklarować jako ważny program Celu C. Cel C może z łatwością podążać za zmianami, takimi jak C99 i C11.
Z drugiej strony, C ++ to nie tylko rozszerzenie C; jest to inny język, który zmienia znaczenie niektórych składni C. C ++ i C są utrzymywane osobno, więc ich związek zmienia się w czasie. Na przykład C uzyskał nowe funkcje, które są całkowicie nieobecne w C ++ i prawdopodobnie nie przejdą do C ++, takie jak tablice C99 o zmiennej długości. C ++ nie może łatwo znaleźć nowych funkcji C.
Jeśli piszesz przenośny program w C, powinien on być jednocześnie programem Objective C. Potrzebna będzie jednak dodatkowa uwaga, aby był to również program w C ++ o tym samym znaczeniu. (Ta praktyka nie jest niczym niezwykłym, a dialekt, którego wymaga, jest nieformalnie nazywany „czystym C”).
Prostym przykładem programu w C, który ulega awarii, gdy jest traktowany jako C ++, jest dowolny program w C, który używa słowa kluczowego C ++ jako identyfikatora, takiego jak
class
lubvirtual
. Cel C nie wprowadza żadnych zastrzeżonych słów kluczowych. Ma nowe słowa kluczowe, które są wprowadzane przez@
postać, na przykład@interface
.źródło