Void main(void)
{
printf("\nимя текущего файла %s",__FILE__);
printf("\nномер текущей строки в исходном файле %d",__LINE__); printf("\nдата начала обработки препроцессором %s",__DATE__); printf("\nвремя начала обработки препроцессором %s",__TIME__);
}
Отмена макроопределения
Директива #undef отменяет самое последнее макроопределение. Повторное определение константы ведет к переопределению, при компиляции машина предупредит вас о переопределении, как о возможной ошибке. Возможно применение директивы #undef к несуществующей константе.
Пример 5.
#define BIG 3
#define HUGE 3
#undef BIG /* BIG не определена */
#define HUGE 10 /* HUGE переопределена */
#undef HUGE /* HUGE равна 3 */
ВКЛЮЧАЮЩИЕ ДИРЕКТИВЫ
По директиве #include текст указанного (заголовочного) файла включается в текст программы.
Чаще всего директива #include пишется в начале программы, а заголовочный файл содержит директивы #define, возможно, директивы #include, объявления структур и внешних переменных.
Заголовочный файл может содержать и определение какой-либо функции, а по директиве #include текст этой функции будет включен в вашу программу.
Однако, включающая директива может встретиться и в любом месте функции - в этом случае заголовочный файл содержит какой-либо фрагмент программы.
Заголовочные файлы могут быть системные и пользовательские.
Пример 6.
#include <stdio.h> /* включение системного файла */
#include "myfile.h" /*включение пользовательского файла из текущего каталога и */
#include "c:\user \ my.h" /* с указанием пути поиска */
Пример 7.
/* текст программы до обработки препроцессором */ #include<stdio.h>
Void main(void)
{
#include"my1.h"
}
/* содержимое файла my1.h */
printf("hello!\n");
/* текст программы после обработки препроцессором */
/* содержимое файла stdio.h */
Void main(void)
{
printf("hello!\n");
}
/* ДИРЕКТИВЫ УСЛОВНОГО ВКЛЮЧЕНИЯ
Нередко требуется иметь возможность избирательно включать или исключать некоторые части программы на этапе компиляции. Например, на этапе отладки программы включать выдачу на экран значения промежуточных данных, комментарии, а при рабочем выполнении программы эту часть текста исключить, или, с помощью условной компиляции, отобразить несколько путей решения задачи. В этом случае наша программа выступит в роли генератора программ, поскольку при разных режимах работы препроцессор будет собирать программу из разных частей. Директивы условного включения по структуре и выполнению полностью аналогичны обычным условным операторам.
Синтаксис:
#ifdef идентификатор /* если идентификатор определен */
текст1/* в текст программы включается текст1*/
#else /* иначе (идентификатор не определен) */
текст2 /* в текст программы включается текст2*/
#endif /* конец области действия директивы */
#ifndef идентификатор /* если идентификатор не определен */
текст1 /* в текст программы включается текст1*/
#else /* иначе (идентификатор определен) */
текст2 /* в текст программы включается текст2*/
#endif /* конец области действия директивы */
#if выражение1 /* если выражение1 истинно */
текст1 /* включается текст1 */
#elif выражение2 /* если выражение1 ложно, но выражение2*/
текст2 /* истинно включается текст2 */
#else /* иначе - включается текст3 */
текст3
#endif
/*Ветви #else и #elif могут отсутствовать. Выражения должны быть целыми и постоянными (используются целые символические
и обычные константы и логические операции).
В составе #if может использоваться defined(имя_макро), определяющий, является ли имя именем макро.
Например: if defined(A) || defined(B) - если определена A или определена B.
Пример 8.
/*программа работает в двух режимах-отладочном и рабочем текст программы до обработки препроц. */
#define TRACE
#include<stdio.h>
void getline(void);
