Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
48
Добавлен:
16.02.2016
Размер:
83.46 Кб
Скачать

Предопределенные макросы

В приведенной ниже таблице перечислены макросы ANSI, которые компилятор C++ определяет автоматически.

Таблица 10.2.

Предопределенные макросы ANSI

Макрос

Описание

DATE

Строка, представляющая в форме mmm.ddyyyy дату создания данного файла

FILE

Имя текущего обрабатываемого файла

_LINE_

Номер текущей строки обрабатываемого

файла

_STDC_

Определен, если установлен режим совместимости с ANSI С

_ТIME_

Время начала обработки текущего файла в формате hh:mm:ss

Следующий пример демонстрирует использование этих макросов:

#include <stdio.h>

char* Date = _DATE_;

char* Time = _TIME_;

int main()

{

FILE* file;

//...

printf("Дата создания %s, "

"время создания %s\n", Date,Time);

//. . .

file = fopen("Ex.cpp","r+t");

if (file == NULL)

{

printf("Ошибка в вызове функции fopen()" "в файле %s, строка %d\n",

_FILE__, _LINE__) ;

return 1;

}

//...

return 0;

}

Операции, применяемые в директивах препроцессора

Существуют две операции, которые можно использовать в директивах препроцессора: подстановка строки (#) и конкатенация (##).

Если перед параметром макроса указана операция подстановки символа ( #), то компилятор при раскрытии макроса вместо параметра подставит его имя. Как и любая строка, результат этой операции может объединяться со смежными строками, если отделяется он них только пробелами. Рассмотрим пример:

#include <stdio.h>

#define SHOWVAL(val)\

printf(#val " = %d \n", (int)(val))

int maint)

{

int icount = 10;

//...

SHOWVAL(icount);

return 0;

}

При выполнении программа выводит на экран:

icount = 10;

Операция конкатенации (или склейки) ## вызывает объединение двух строк в одну. Перед объединением строк удаляются разделяющие их пробелы. Если для полученной в результате склейки строки существует макроопределение, препроцессор выполняет раскрытие макроса. Например:

#define MACR01 printf("Вызов MACR01.")

#define MACRO2 printf("Вызов MACR02.")

#define CREATE_MACRO(n) MACRO ## n

//... CREATE_MACRO(1) ;

В результате раскрытия макроса препроцессором компилятор получит следующую инструкцию:

printf("Вызов MACRO1.");

Если операция конкатенации используется в макроопределении, то вначале препроцессор выполняет подстановку аргументов вместо формальных параметров, затем выполняет операцию конкатенации. После этого выполняются остальные операции макроопределения. Например:

#define DEFVAL(i) int var ## i

//...

DEFVAL(l);

В результате раскрытия макроса препроцессором компилятор

получит следующую инструкцию:

int varl;

Соседние файлы в папке ЯзыкС++Глушаков