Cel C to zestaw wstecznie kompatybilnych rozszerzeń C. Jest to możliwe, ponieważ cechy celu C są rozgraniczone na dwa bardzo proste sposoby:
- użycie znaku
@. Ten znak nie jest obecnie używany w języku C.
- prosty składniowym rozszerzeniem dla wywoływania metod
[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 classlub virtual. 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.