Г. Шилдт - Полный справочник по C++ (1109478), страница 44
Текст из файла (страница 44)
В противном случае оно ложно. Например, чтобы распознать, является ли именованная константа агггхьв опредеяенной, можно использовать олпу из следуюших команд препроцессора: й ВЕГ деЕ1пед МУР1ЬВ а а(ЫеЕ МРРХьк Поставив перед оператором ктеЕЕпед символ (, можно задать противоположное условие. Например, следуюший фрагмент программы кол1пилируется только в тол1 случае, если именованная константа паапа не определена.
а1( с)еЕЕпес) ()ВВПП ртЕпСЕ('*РЕпа1 чего(оп(чп"); В еаза й Одна из причин, по которои используется оператор аеелпед, состоит в том, что он позволяет проверить, определено ли имя макроса с помошью оператора Эе11Е. ~ Директива Ипе Директива 011пе соответственно изменяет содержимое макросов Ь|МВ и Ртьв, представляюших собой идентификаторы, определенные компилятором. Идентификатор ьптв содержит номер текушей строки компилируемого кода. Илентификатор Ртьв представляет собой строку, солержашую имя компияируелюго файла. Общий вид директивы «11пе таков.
$11пе номер "имя файла*' Здесь параметр номер равен любому положительному числу, которое становится новым значением макроса ымв . Параметр иыя файла не обязателен и может быть любым допустимым именем файла, которое становится новым значением макроса РХЬВ . Директива Ваапе в основном используе~ся при отладке программ и в специальных приложениях.
Например, следуюший код устанавливает, что нумерацию строк следует начинать с числа 1ОО. Функция рт1псЕ() выводит на экран число 102, поскольку она находится в третьей строке программы, отсчитывая от лирективы 011пе 100. Глава 10. Препроцессор в комментарии :; Фзпс1пс)е «вс«)зо.п> 6 $ Я).тпе 100 1пс аза1п(уоЫ) Гзхзпет ("а«)1п", Ытнв ) з геспгп Оз /" Устанавливает счетчик строк */ /* Строка 100 */ /* Строка 101 */ /* Строка 102 */ ~ Директива Ф ргаупа Директияа ()ртавеа зависит от реализации. Она позволяет передавать компилятору различные команды.
Например, компилятор может иметь опцию, предусматриваюшукз трассировку выполнения прог)язммы. Зту опцию можно задать с помошью директивы Врсаваза. Детали и допустимые опции перечисляются в документации, сопровождаюшей компиляз ор. =Л Операторы препроцессора Ф и ФФ () рспроцессор превратит строку ' рз йгст (ю)«вгг(я лоозз»з с++) ) з и ст)зок)' рххпст ( я люб,ю С++ ) Оператор ВВ, называемый оиеригаораи коикалзснииии (раз((щ), "силен)изет" две лекссьзы, 3 4)пстзкзе «ае«(то.н> з) а«(ейтпе сопсас(а, Ь) а ФС Ь з апс азате[тот«)) ( 1пс ху = 10) Часть (. Основы языка С+»: подмножество С Препроцессор имеет два оператора: () и М().
Зти операторы используются в директиве ()оет1пе, Оператор М, который называется олеритором ззревразиеиия в си»року (з(ппя(те), преобразует свой аргумент в с~року, заключенную в кавычки. В качестве примера рассмотрим слелуюшую программу. ; Ф (пг 1 пс)о «в Сото. Ь> Ё Ф«)ступе азкасг(а) Ф а 'В з зпс паап(чозо) ( рттпН (еКасг(я люблю С++))з гетпзп оз б ргдпст("Ъд", сопсас(х, у)); [ гееигп О; Препроцессор преобразует строку й ргйпсй("ес)", сопсас(х, у)); в строку й ргапгх["ас", ху); Если эти операторы показались вам странными, вспомните, что в большинстве случаев без них можно спокойно обойтись. В основном они предназначены для обработки некоторых особых ситуаций. ~ Имена предопределенных макросов В языке С++ существует шесть встроенных имен макросов: т.хнж Р1ЬЕ рдтж тхмд втрс ср1ивр1ив Первые пять из этих макросов относятся к языку С.
Макросы ьхмв и втык уже обсуждались в разделе„посвяшенном директиве «11пе. Кратко говоря, они содержат номер текушей строки и имя компилируемого файла. Макрос рдтв содержит строку, имеюшую внд х[еглнггдень|год. В него записывается дата компиляции файла. Макрос танк солержит время компиляции программы, представленное в формате чнсыы[ннун[ы секунды. Смысл макроса атос зависит от реализации.
Как правило, если л[акрос втрс определен, компилятор строго придерживается стандарта языков С и С++, не допуская никаких нестандартных расширений'. Компилятор, строго полдерживаюший стандарт языка С++, определяет макрос ср1ивр1ив, значение которого содержит как минимум шесть цифр. Колшиляторы, допускаюшие нестандартные расширения, оиределя[от значение макроса ср1ивр1ив, состоя[нее из пяти и меньшего количества знаков.
~ Комментарии Стандарт С89 допускает лишь один вид комментариев, начинаюшихся символами у* и заканчиваю[цихся символами *д Между звездочкой и косой чертой не должно быть пробелов. Компилятор игнорирует текст, заключенный внутри комментариев. Например, следуюшая программа выведет на экран слово "Привет". Фзпс1иде <вело.б> гг~ Глава 10. Препроцессор и комментарии тпс шаз.п[чоаст) ( ргапсс("привет"); /* рхтлес("ЗдЕСЬ")Г */ гевцхг. Ог ) Этот стиль комментариев называется многострочным (пш)г)))пе согпгпепг), поскольку такие комментарии могут состоять из нескольких строк. / /* Зто — пример многострочного комментария */ Комментарии можно размещать в любом месте программы, с олним исключением: они не могут разрывать ключевые слова или идентификаторы.
Например, следующий комментарий вполне корректен. $ к †. 10+ /* добавляем число */5/ В то же время комментарий $ вша/*ото совершенно неправильно*/сои(с) ( неверен, поскольку ключевое слово не может содержать комментарий. Впрочем, комментарии не следует вставлять в середину выражений, так как зто лишь запугыюет программу. Многострочные комментарии не могут быть вложенными. Иначе говоря, один комментарии не может содержать другои. Например, следующий фрагмент кода вызовет ошибку компиляции. /* Зтс внешний комментарий к = у/а; /* Зто внутренний комментарии — он порождает ошибку "/ */ Однострочные комментарии Язык С++ (и станларт С99) предусматриюег дю вида комментариев.
Во-первых, многострочные комментарии. Во-вторых, одностроч/гые комненшарли (а)пя)е-1)пе согпгпепга). и // Зто — однострочный комментарий. Однострочные комментарии особенно полезны лля создания кратких пошаговых описаний программы. Несмотря на то что они не подаержиюк~ся стандартом С89, многие компиляторы языка С позволяют их применять Кроме того, они'были включены в сюнларт С99. И последнее: однострочные комментарии можно вкчадыють в многосзрочные, Комментарии следует размешать там, где необходимы поясненги.
Например, все функции. за исключением очень корейских и самоочевидных, должны содержать комментарии, в которых описано их прелназначенис, способ вызою и возврашаемое значение. Часть!. Основы юыка С+И подмножество С Полный справочник по В первой асти мы рассмотрели язык С„являющийся подмножеством языка С++. Во второЙ части описываются свойства, характерные лишь для языка С++. Нными словами, в ней обсуждаются особенности языка С++„которых нет в языке С. Поскольку многие своиства языка С++ предназначены для поддержки объектно-ориентированного про-граммирования (ООП), во второй части также рассматриваются теория и преимушества именно атой парадигмы.
Начнем с обзора языка С++. давщои гладе содержится обзор освюаиыл ковщсппии, изплошснцых н языке В Сч-+. Объектно-ориснтиронанныс снойспва языка С+-в тесно связаны лруг с прутом. По этой причине часто бьпюст трудно описгпь одно понятие, пс затронув друвих.
Чтобы решить эту п!юблсму, мы ощча;ю предашасм нашему анимацию беглыи обзор наиболсс важных аспскзон языка С+-л. к которым относятся сво история. кюочсные слоистая, а также различия между трслнциощюи и стандартной нсрсиями языка С+.к В остальных гланал мы рассмотрим сноистна языка Сч-ъ более подробно.
~в ИСТОКИ яЗЫКа С++ Изначально язык С++ предстанлял собой расширение языка С. Впсрные он был разработан н 1979 году Бьярном Страуструпом (Вдагпе 5вговвзвгввр). сотрудником компании Ве!1 ЕввЬогавог!ез н г. Мюррей Хилл (штат Нью-Джерси) Свив ва.ва язык пазынался "С с классами", олнако н 1983 голу его нгынание было изменено на С ". Хотя язык С был одним из наиболее любимых и широко распростр;шенных профессиональных языкон программирования, сто мощности уже не хназало для решения оснонной проблемы: возрастающей сложности программ.
Со нременелв программы становились нсе более крупными и сложными. Безуслонно, язык С -- прсносхолный язык програлвлвиронанви, но его нозможности, к сожаленввю, ввврани вены. Если размер программы колеблется н пределах от 25000 до 100000 строк кода, она сзшюнится в вастолько сложной, что механизмы языка С не позволяют работать с нси, как с единым целым. Одной из целен языка С++ было прсололепие этого препятстния. Язык Ся+ позволил программистам прекрасно справляться с более крчпными и сложными программами. Большинство усонерцвенстнонаннй, ннссснных Стра)струпом н язык С, касалось поддержки объектно-ориентированного провраммиронапия (ООП), (Краткое описание этой парадигмы программирования солержится н следчющсм разделе ) Страуструп утнерждает, что некоторые объеквно-орисвпиронанныс сноистна языка С-в-+ были унаследонаны у другого объекпю-ориснтиронанного языка — 5!впвв!а 67.