Читайте также: |
|
Директива #undef имя удаляет определение символа (макроимени). Используется редко, например, для удаления какой-либо опции компилятора. Вот, несколько искусственный, пример:
#define LEN 100#define WIDTH 100 char array[LEN][WIDTH]; #undef LEN#undef WIDTH/* в этой точке как LEN, так и WIDTH становятся неопределенными */ Директива #errorДиректива #error заставляет компилятор остановить компиляцию в том месте, где встретилась эта директива. Используется для отладки. Общая форма такова:
# error message
Когда встречается #error – выводится сообщение (message) и номер строки исходного кода.
Директива #pragma
Директива #pragma зависит от реализации компилятора. Она позволяет указать разнообразные инструкции для компилятора, например, если компилятор поддерживает режим трассировки выполнения программы, то эта опция, обычно, указывается с помощью директивы #pragma. Но лучше читать документацию по конкретному компилятору.
Предопределенные макроимена.
В C++ определено несколько встроенных макросов, предназначенных в основном для того, чтобы выдавать информацию о версии программы или месте возникновения ошибки.
Это следующие макроимена (с двумя символами подчеркивания):
_ _LINE_ __ _FILE_ __ _DATE_ __ _TIME_ __ _cplusplusИдентификатор __LINE__ - целое, содержит номер текущей строки исходного текста, __FILE__ - строка в стиле C (завершается символом ‘\0’), содержит полное имя текущего файла. Эти макроимена часто используются с директивой #line.
Директива #line изменяет содержимое __LINE__ и __ FILE__. Основная форма использования
#line number "filename"
где number – положительное целое, а filename – верный (правильный) идентификатор. Значение number становится номером строки текущего исходного файла, а filename становится именем исходного файла. Имя файла – не обязательно. #line используется, в основном, для отладочных целей.
Например, следующий код устанавливает счетчик текущей строки равным 10, а имя файла - “test”:
#line 10 "test"Идентификатор __DATE__ содержит строку с текущей датой в формате месяц день год, например: printf(“ Дата компиляции - %s \n”, __DATE__);
Идентификатор __TIME__ содержит время трансляции исходного кода в объектный код, в виде строки в формате hour: minute: second. Например, printf(“ Ошибка в файле %s \n Время компиляции: %s \n”, __FILE__, __TIME__);
Макрос _ _cplusplus автоматически определеляется компилятором, если программа компилируется как программа на C++. Использование этого макроса позволяет указать, что можно использовать возможности C++ в форме, например:
#ifdef __ cplusplus
// действия, специфические для C++
#endif
Операции препроцессора # и ##
Препроцессор C/C++ имеет две специальных операции для манипуляции строками в макросах: # и ##. Эти операции используются с директивой #define. Первая операция – операция создания строки, вторая – операция конкатенации строк.
Операция # действует на аргумент макрофункции, которому операция предшествует, превращая его в символьную строку, заключенную в двойные кавычки. Например, рассмотрим код:
#include <iostream>using namespace std; #define mkstr(s) #s int main(){ cout << mkstr(I like C++); return 0;}Здесь, препроцессор превращает строку кода
cout << mkstr(I like C++);в такую
cout << "I like C++"; Или, например, если мы напишем: #define WRITESTRING(x) cout << #xи, затем, вызовем макрос
WRITESTRING(This is a string);,то препроцессор преобразует этот вызов в такой код:
cout << "This is a string";Операция ## используется для конкатенации двух лексем. Например, в следующей программе,
#include <iostream>using namespace std; #define concat(a, b) a ## b int main(){ int xy = 10; cout << concat(x, y); return 0;}препроцессор преобразует
cout << concat(x, y);в код
cout << xy;Следует упомянуть об одном полезном макросе языка C. Стандартная библиотека С предоставляет макрос assert(), который проверяет некоторое условие и в случае, если оно не выполняется, выдает диагностическое сообщение и аварийно завершает программу (некоторые компиляторы C++ могут возбуждать исключения, об исключениях мы узнаем попозже). Это средство довольно часто используют. Для его применения следует включить в программу директиву
#include <assert.h>
assert.h – это заголовочный файл стандартной библиотеки С. Программа на C++ может ссылаться на заголовочный файл как по его имени, принятому в C, так и по имени, принятому в C++. В стандартной библиотеке С++ этот файл носит имя cassert. Имя заголовочного файла в библиотеке С++ отличается от имени соответствующего файла для С отсутствием расширения.h и подставленной спереди буквой c (выше уже упоминалось, что в заголовочных файлах для C++ расширения не употребляются, поскольку они могут зависеть от реализации).
Эффект от использования директивы препроцессора #include зависит от типа заголовочного файла. Инструкция
#include <cassert>
включает в текст программы содержимое файла cassert. Но поскольку все имена, используемые в стандартной библиотеке С++, определены в пространстве std, имя assert() будет невидимо до тех пор, пока мы явно не сделаем его видимым с помощью следующей using- директивы:
using namespace std;
Если же мы включаем в программу заголовочный файл для библиотеки С
#include <assert.h>
то надобность в using-директиве отпадает: имя assert() будет видно и так.
Дата добавления: 2015-11-16; просмотров: 38 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Директивы условной компиляции (условные директивы). | | | Конструкторы и деструкторы |