Cтраница 1
Препроцессор транслятора с языка Си обеспечивает возможность выполнения трех основных операций: подстановки строк, включения файлов и условной трансляции. Препроцессор, являясь фактически нулевым проходом транслятора с языка Си, обеспечивает возможность выполнения предписываемых ему действий до начала трансляции программы. [1]
Препроцессор транслятора с языка Си предоставляет ряд возможностей, отсутствующих в языке Паскаль. Примерами таких возможностей служат символические константы и константные выражения, облегчающие модификацию программ и повышающие их удобочитаемость, а также использование макросов вместо вызываемых подпрограмм, что повышает эффективность программ. Однако необходимо отметить, что использование макросов не столь безопасно, как использование вызываемых подпрограмм. [2]
При использовании языка Си не возникает проблем в рассмотренных выше ситуациях, поскольку препроцессор транслятора с языка Си предоставляет в распоряжение программиста все необходимые средства. Аналогичный препроцессор несложно было бы реализовать и для языка Паскаль. [3]
Хотя в языке Си и отсутствует возможность использования утверждений, эту возможность легко реализовать с помощью препроцессора транслятора с языка Си. Опыт использования реализованных таким образом утверждений в языке Си показывает, что их использование несложно и облегчает отладку программ. [4]
До некоторой степени это можно смягчить, используя механизм, реализованный в языках Си и Ратфор с помощью конструкции include, обрабатываемой препроцессором транслятора с языка Си: файлы, содержащие исходный текст различных компонентов программы, могут быть включены в нужное место программы, не внося беспорядка в программу и не загромождая ее. Конструкция include не является частью языка Паскаль, но реализована в первых трех из четырех упомянутых в разд. [5]
![]() |
Ключевые слова препроцессорных средств PL / I. [6] |
В заключение приведем для справок используемые в препроцессорных средствах ключевые слова ( табл. 2), которые кратко отображают возможности, имеющиеся в препроцессоре транслятора с языка PL / I ОС ЕС. [7]
Составные операторы или блоки в языке Си выделяются с помощью символов и, а комментарии - с помощью символов / и / Строки программы, начинающиеся с символа обрабатываются препроцессором транслятора с. Оператор присваивания обозначается в языке Си с помощью символа, а символы [ и ] используются в обозначениях массивов. [8]
Для языка Паскаль отсутствует набор средств, реализуемых некоторым стандартным макропрепроцессором. Использование описателя const в языке Паскаль позволяет решить около 95 % проблем, решаемых в языке Си с помощью конструкции define, реализуемой препроцессором транслятора с языка Си. Однако для оставшихся 5 % проблем удовлетворительное решение отсутствует. Конечно, не очень сложно добавить макропрепроцессор к транслятору с языка Паскаль. [9]
В языке Си имеется препроцессор, который обеспечивает расширение макросов путем выполнения подстановки строк. Этот препроцессор часто используется для введения символических констант, улучшающих удобочитаемость программ и упрощающих внесение в программы изменений. Осторожное и аккуратное использование этого препроцессора дает хорошие результаты. Однако, как обычно это бывает в языке Си, препроцессор транслятора с языка Си не предусматривает проведения контроля типов. Более того, хотя трудно спорить с тем, что использование препроцессора транслятора с языка Си оказывает существенную помощь при написании программ, необходимо помнить, что его использование может привести ( и очень часто приводит) к ухудшению удобочитаемости программ. [10]
Составные операторы или блоки в языке Си выделяются с помощью символов и, а комментарии - с помощью символов / и / Строки программы, начинающиеся с символа обрабатываются препроцессором транслятора с. Оператор присваивания обозначается в языке Си с помощью символа, а символы [ и ] используются в обозначениях массивов. В приведенном ниже примере программы на языке Си строка, содержащая конструкцию include, в результате работы препроцессора транслятора с языка Си будет заменена на содержимое файла с именем stdio. Оператор typedef обеспечивает возможность определения новых типов данных, в данном случае тип item определяется как структура, содержащая два поля - поле ключа и поле значения. Оператор цикла while обеспечивает выполнение своего тела до тех пор, пока условие low high является истинным. [11]
В языке Си имеется препроцессор, который обеспечивает расширение макросов путем выполнения подстановки строк. Этот препроцессор часто используется для введения символических констант, улучшающих удобочитаемость программ и упрощающих внесение в программы изменений. Осторожное и аккуратное использование этого препроцессора дает хорошие результаты. Однако, как обычно это бывает в языке Си, препроцессор транслятора с языка Си не предусматривает проведения контроля типов. Более того, хотя трудно спорить с тем, что использование препроцессора транслятора с языка Си оказывает существенную помощь при написании программ, необходимо помнить, что его использование может привести ( и очень часто приводит) к ухудшению удобочитаемости программ. [12]
Программа на языке Си может состоять из большого числа подпрограмм, называемых функциями, хранящихся в различных файлах. Файл, содержащий исходный текст программы ( или ее части) на языке Си, может содержать внешние объекты, данные и функции, которые могут быть либо локальными по отношению к этому файлу, либо глобальными по отношению к некоторому набору файлов. Выполняемые операторы группируются в блоки, которые могут вкладываться один в другой на произвольную глубину. Переменные могут быть описаны в начале любого блока. Большая часть файлов, содержащих исходные тексты программ на языке Си, начинаются с прелюдии - последовательности операторов, обрабатываемых препроцессором транслятора с языка Си. По принятому соглашению каждая программа на языке Си имеет среди составляющих ее функций функцию с именем main, с которой и начинается выполнение программы. Передача параметров всех типов, за исключением массивов, осуществляется по значению. В случае массива в качестве значения передается адрес первого элемента массива. [13]