Предопределенные макросы
В приведенной ниже таблице перечислены макросы 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;