Препроцессор C подключен к C, но его синтаксис совершенно отличается от основного языка:
синтаксически значимые пробелы (конец строки завершает оператор, пробел после макроса определяет начало списка замены)
блоки на основе ключевых слов вместо фигурных блоков
elif
вместоelse if
определения на основе ключевых слов вместо объявления-отражает-использование, нет
=
для определения значенияподсказки альтернативного строкового синтаксиса (
#include <>
против#include ""
)ленивая оценка (очевидно, C; но 6.10.3.1 может быть прочитан как подразумевающий определенный порядок макроразложения, а также в тех немногих местах, которые имеют значение)
Это действительно не похоже на C на всех! Технически это является его собственный язык, но он всегда был использован в качестве почти-неотъемлемая часть C , и кажется очень странным , что он не будет интегрироваться с ней синтаксически.
Википедия не говорит о своей истории; Портлендский репозиторий паттернов упоминает об этом мимолетно , но не вдавается в подробности, кроме того факта, что он был разработан другими людьми, чем остальная часть сайта С. Денниса Ричи с историей Си, вероятно, имел ответ, но, к сожалению, нет дольше доступны.
Как макродвижка, это , очевидно , имеет очень разную семантику от языка исполнения, который бы объяснить некоторые различия, но не визуальные аспекты дизайна (это также неясно , современный взгляд , была ли она изначально предполагались как способен на вид от удовольствия , что его замена системы позволяет, или это был «просто» целесообразный способ встроить функции за время до мощных оптимизаторов). Похоже, что-то ближе к тому, что в итоге стало шаблонами C ++, было бы более логичной эволюцией в сторону макросов, если бы C-подобная семантика фактически была отправной точкой, но есть меньше конкретных доказательств этого, чем для синтаксиса.
У нас есть какие-либо записи о том, почему он был разработан таким образом, или как повлияли создатели?
Ответы:
С http://www.jslint.com/chistory.html («Развитие языка Си» Дениса М. Ричи):
Из описания в разделе 4 ссылки [Snyder 74], связанной в приведенной выше цитате, следует, что Алан Снайдер работал над переносным (сегодня можно сказать «ретаргетируемым») компилятором Си. Возможно, это и послужило мотивацией для запроса препроцессора.
Однако я не смог найти никаких дополнительных подробностей о дизайне самого препроцессора C как языка.
источник
Я мог бы просто добавить, что для ассемблеров было очень распространено иметь препроцессоры макроассемблера, которые очень похожи на CPP.
источник