Preprocesor C jest dołączony do C, ale ma zupełnie inną składnię niż język główny:
znaczące spoczynkowo białe znaki (koniec linii kończy instrukcję, przerwa po tym, jak makro określa początek listy zastępczej)
bloki oparte na słowach kluczowych zamiast wzmocnionych bloków
elif
zamiastelse if
definicje oparte na słowach kluczowych zamiast deklaracji odzwierciedla użycie, nie
=
dla definicji wartościwskazówki dotyczące alternatywnej składni łańcucha (
#include <>
vs#include ""
)leniwa ocena (oczywiście C; ale 6.10.3.1 można odczytać jako sugerującą określoną kolejność ekspansji makr, w kilku miejscach, które mają znaczenie)
To naprawdę nie wygląda jak C! Technicznie jest to jego własny język, ale zawsze był używany jako prawie integralna część C i wydaje się bardzo dziwne, że nie zintegrowałby się z nim syntaktycznie.
Wikipedia nie mówi o swojej historii; repozytorium wzorców Portland podaje je mimochodem , ale nie wykracza poza to, że zostało zaprojektowane przez innych ludzi niż reszta strony C. Dennisa Ritchiego z historią C, prawdopodobnie zna odpowiedź, ale niestety nie dostępne dłużej.
Jako makro silnika, to oczywiście ma bardzo różne semantykę z języka wykonawczym, które mogłyby wyjaśnić pewne różnice, ale nie aspektów projektowania wizualnego (jest również jasne, nowoczesne oczy, czy to było pierwotnie przeznaczone jako zdolny z rodzaju z radości , że jego system wymiany pozwala, czy też był to „po prostu” celowy sposób wstawiania funkcji w czasie przed potężnymi optymalizatorami). Wydaje się, że coś bliższego temu, co ostatecznie stało się szablonami C ++, byłoby bardziej logiczną ewolucją w kierunku makr, gdyby semantyka podobna do C była faktycznie punktem wyjścia, ale jest mniej konkretnych dowodów na to niż na składnię.
Czy mamy jakąkolwiek wzmiankę o tym, dlaczego została zaprojektowana w ten sposób lub jakie były wpływy twórców?
Odpowiedzi:
Od http://www.jslint.com/chistory.html („Rozwój języka C” Dennisa M. Ritchiego):
Z relacji w sekcji 4 odnośnika [Snyder 74] połączonego w powyższym cytacie wynika, że Alan Snyder pracował na przenośnym (dziś można powiedzieć „retargetowalnym”) kompilatorze C. Być może była to motywacja, by poprosić o preprocesora.
Nie udało mi się jednak znaleźć żadnych dodatkowych szczegółów na temat samej konstrukcji preprocesora C jako języka.
źródło
Mogę tylko dodać, że w językach asemblera bardzo często występowały preprocesory asemblera makr, które wyglądają bardzo podobnie do CPP.
źródło