- •91.Совместимость типов. Перечисляемые типы. Типы массивов. Типы функций. Типы структур и объединений. Типы указателей. Совместимость нескольких исходных файлов.
- •92.Макроопределения. Определение макросов. Макросы и параметры. Сложности при раскрытии макросов.
- •93Макросы, поставляемые вместе с компилятором. Выбор макроопределения или функции. Макросы, поставляемые вместе с компилятором.
- •Выбор макроопределения или функции.
- •95Директивы #ifdef и #endif. Директива #undef. Директива #ifndef. Директивы #ifdef и #endif.
- •Директива #if. Директива #else. Директива #elif.
- •97Директива #line. Директива #error. Директива #pragma. Условная компиляция. Директива #line.
- •Дополнительные операции препроцессора. Операция подстановки строки (#). Операция конкатенации (##).
- •Операция конкатенации (##).
- •99Дополнительные операции препроцессора. Операция подстановки символа (#@). Обработка ошибок: perror(). Операция подстановки символа (#@).
- •Обработка ошибок: perror().
- •100Модели памяти. Модель tiny. Модель small. Модель medium. Модель compact. Модель large. Модель huge.
95Директивы #ifdef и #endif. Директива #undef. Директива #ifndef. Директивы #ifdef и #endif.
Директивы #ifdef и #endif -условные директивы препроцессора. Их можно использовать для выборочного включения в программу некоторых операторов. Директива #endif применяется со всеми условными командами препроцессора и означает конец условного блока. Например, если ранее было определено имя LARGE_CLASSES, то в следующем фрагменте программы описывается новое имя MAX_SEATS:
#ifdef LARGE_CLASSES
#define MAX_SEATS 100
#endif
Директива #undef.
Директива #undef сообщает препроцессору об отмене всех предыдущих определений для указанного идентификатора.
#ifdef LARGE_CLASSES
#undef MAX_SEATS 30
#define MAX_SEATS 100
#endif
Директива #undef отменяет самое последнее определение поименованного макроопределения.
Директива #ifndef.
По команде #ifndef препроцессор определяет отсутствие указанного идентификатора и выполняет некоторые действия. Следующий фрагмент кода взят непосредственно из файла stdio.h:
#ifndef _SIZE_T_DEFINED
typedef unsigned int size_t;
#define _SIZE_T_DEFINED
#endif
Директива #if. Директива #else. Директива #elif.
Директива #if.
В директиве #if также присутствует лексема defined.
при помощи директивы #if и конструкции defined выполняются те же действия, которые требовали вложенных директив #ifndef и #ifdef:
#if defined(LARGE_CLASSES) && !defined (PRIVATE_LESSONS)
#define MAX_SEATS 30
#endif
#ifdef LARGE_CLASSES
#ifndef PRIVATE_LESSONS
#define MAX_SEATS 30
#endif
Директива #else.
#else, обеспечивает одинаковый размер целых чисел в обеих системах:
#ifdef VAX_SYSTEM
#define INTEGER short int
#else
#define INTEGER int
#endif
Директива #elif.
Директива #elif является сокращением от "else if"; она используется как альтернативный вариант при построении вложенных операторов #if. При помощи следующих операторов определяется какой размер класса определен и однозначно задается макрос:
#if defined (LARGE_CLASSES)
#define BILL printf("\nCost per student $100.00.\n")
#elif defined (PRIVATE_LESSONS)
#define BILL printf ("\nYour tuition is $1000.00.\n")
#else
#define BILL printf("\nCost per student $150.00.\n")
#endif
97Директива #line. Директива #error. Директива #pragma. Условная компиляция. Директива #line.
Директива #line отменяет автоматическую нумерацию строк, выполняемую компилятором; она может помочь при отладке программы.
Если же включить директиву #Iine в начало только что добавленной процедуры, то компилятор выдаст номер ошибочной строки относительно начала функции
код определяет, что счетчик строк будет начинаться с 100, а оператор printf() выводит номер 102, потому что он расположен в третьей строке программы после оператора #line 100:
#include <stdio.h>
#line 100
int main(void)
{
printf("%d\n",__LINE__);
return 0;
}
Директива #error.
сновном для отладки. В общем виде директива #error выглядит таким образом:
#еrrоr сообщение-об-ошибке
сообщение-об-ошибке в двойные кавычки не заключается. Когда встречается директива #error, то выводится сообщение об ошибке — возможно, вместе с другой информацией, определяемой компилятором.
Директива #pragma.
Директива #pragma — это определяемая реализацией директива, которая позволяет передавать компилятору различные инструкции. Например, компилятор может поддерживать трассировку выполнения программы. Тогда возможность трассировки можно указывать в операторе #pragma. Возможности этой директивы и относящиеся к ней подробности должны быть описаны в документации по компилятору.
Условная компиляция.
Имеется несколько директив, которые дают возможность выборочно компилировать части исходного кода нашей программы. Этот процесс называется условной компиляцией