Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Бичков - Основи сучасного програмування.doc
Скачиваний:
69
Добавлен:
07.03.2016
Размер:
2.67 Mб
Скачать

3.6.3. Директива #include

Є два основні типи директиви #include:

#include "шлях"

#include <шлях>

Якщо використовуються подвійні лапки та вказується повний шлях до відповідного файла, то пошук здійснюється за цим шляхом. Якщо шлях указано не повністю, то пошук здійснюється:

 у робочому поточному каталозі, де знаходиться файл відповідної С-програми;

 у каталогах, указаних у командному рядку;

 у стандартних каталогах, що задаються командою pass операційної системи MS-DOS.

Якщо використовуються кутові дужки, то послідовність пошуку відрізняється тим, що ігнорується пошук у робочому каталозі, тобто файл шукається в каталогах, указаних у командному рядку компіляції, та в стандартних. Шлях у цій директиві також може задаватися з використанням макропідстановок:

#define myway "e:\bc\bin\bc\mylib.h'

#include myway

3.6.4. Директиви умовної компіляції #if, #elif, #else, #endif

#if<обмежувально-константний вираз><текст>

[#elif<ОКВ><текст>]

[#elif<ОКВ><текст>]

[#else<текст>]

#endif

Можна компілювати елементи програми залежно від умов. ОКВ – це вираз, який не може містити цілих констант, змінних перераховного типу, операції sizeof (у компіляторах фірми Microsoft). У випадку істинного значення цього виразу відбувається компіляція тексту до найближчої директиви elif чи else. При найближчій директиві elif здійснюється компіляція тексту у випадку істинності відповідного ОКВ, #endif – обов'язкова конструкція. Наприклад:

#if sizeof(void*)==2

#define void2

#else

#define void more2

#endif

В ОКВ допускається використання препроцесорної операції, яка має синтаксис:

defined(<ім’я>):

#if defined(void2)

printf("void=2');

#endif

Наведемо фрагмент умовної компіляції виклику функції:

#include <stdio.h>

double f(double x)

{return x;}

double g(double x)

{return x;}

double pf(double eps,double(*)(double));

tf(double,double(*)(double));

main()

{int i,j;

#if(i>0)pf(0.0001;f)

#else tf(0.001;g)

#endif}

Директиви умовної компіляції можуть бути вкладеними. Аналогічно, як і у звичайному операторі if, область дії кожної директиви визначається від endif до найближчої директиви if. Наприклад:

#if DLEVEL>5

#define SIGNAL1

#if stackuse==1

#define stack200

#else

#define stack100

#endif

#else

#define SIGNAL100

#if stackuse==1

#define stack100

#else

#define stack300

#endif

#endif

З використанням відповідних директив можна здійснювати гнучке керування, наприклад, регістровими змінними:

#define REG3

#if defined (LILA)

#define REG1 register

#define REG2

#else

#define REG2 register

#define REG1

#endif

main()

{

REG1 int a;

REG2 int b;

REG3 int c;

}

3.6.5. Директива #line

Директива #line<номер><ім’я файла> впливає на повідомлення компілятора про помилку у відповідному файлі чи рядку. Після неї ім'я файла в повідомленні компілятора і, відповідно, номер рядка будуть змінені.

Поточний номер рядка та ім'я вихідного файла можуть бути отримані в програмі з використанням змінних _line_ та file_, які застосовуються також для побудови деяких діагностичних повідомлень:

#line 10 "myfile. cpp'

#define errormessage (cond)

If(!cond)

printf ("помилка в рядку %d файла %s',_line_,_file_);

3.6.6. Директива #error <повідомлення>

Директива #error <повідомлення> перериває роботу препроцесора з видачею відповідного повідомлення:

Fatal line file<повідомлення>

Наведемо фрагмент програми:

#if(MYZM!=0||MYZM!=1)

#error "MYZM має=0 або 1'

#endif