Директиви умовної компіляції

#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;

}

Директива #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

Описувачі з модифікаторами

Моделі пам'яті

Оперативна пам'ять розбивається фізично на сегменти довжиною 64 кілобайти. Кожен із сегментів має певну адресу (номер), кожна змінна визначається за деяким зміщенням усередині сегмента, тобто адреса змінної складається із двох частин: номера сегмента та зміщення. Програмі виділяються два сегменти: один – для коду програми і другий – для статистичних і зовнішніх даних. Однак у деяких випадках виникає необхідність виділяти більше місця для даних чи коду програми. Тоді для організації роботи програми необхідно вибирати іншу модель пам'яті.

Існують такі моделі пам'яті: huge, large, compact, medium, small. Використовуючи певні модифікатори, можна визначати розміщення в пам'яті конкретних об'єктів, що відрізняється від загальноприйнятого в межах вибраної загальної моделі пам'яті.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: