Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Директива #undef .

Читайте также:
  1. Директива #define
  2. Директива Президента РБ № 1 «О мерах по укреплению общественной безопасности и дисциплины».
  3. Директива Совета национальной безопасности США № 20/1 от 18 августа 1948 года.

Директива #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 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Директивы условной компиляции (условные директивы).| Конструкторы и деструкторы

mybiblioteka.su - 2015-2024 год. (0.012 сек.)