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

3.5. Директиви препроцесора

Директиви препроцесора – це команди для препроцесора. Вони не є командами С++. Починаються зі знаку #, наприкінці “ ; ” не ставиться Директиви препроцесора використовуються до компіляції програми.

Приклад:

#include <iostream>

#define age 28

#define message "Привіт!"

Директива #include використовує 2 формати:

#include <файл>

#include "файл"

Кутові дужки вказують препроцесору шукати файл, який включається у зазначених каталогах (у нашому випадку в зазначеному каталозі IDE). Звичайно це каталог INCLUDE. Якщо зазначені (“ ”), то пошук файла здійснюється в каталозі, де знаходиться вихідний текст, а потім, якщо він не буде знайдений, то в тих же каталогах, що й у випадку з кутовими дужками.

Препроцесор цілком вставляє текст зазначеного файла замість директиви #include.

Директива #include частіше усього використовується для включення заголовних файлів, (h-файли). У цих файлах описується, як інтерпретувати бібліотечні функції, використовувані в програмі. Наприклад: iostream – містить необхідну для компілятора інформацію про бібліотечні оператори потокового введення-виведення cout, cin, а також про інші бібліотечні функції, що забезпечують введення - виведення.

При підключенні заголовних файлів стандартної бібліотеки розширення .h можна не вказувати. Це зроблено для того, щоб не обмежувати способи їх зберігання. Для кожного файлу бібліотеки C з ім'ям <name. h > є відповідний файл бібліотеки C++ <cname>, в якому ті ж засоби описуються в просторі імен std. Наприклад, директива #inclucle <cstdio> забезпечує ті ж можливості, що і #include <stdio.h>, але при зверненні до стандартних функцій потрібно указувати ім'я простору імен std.

Призначення директиви #define – знайти та замінити, наприклад:

#define DD 28

В наступному прикладі по всьому тексту перед компіляцією препроцесор змінює х1 на b+c.

Приклад:

#include <iostream>

using namespace std;

#define x1 (b+c)

#define x2 (x1+x1)

void main()

{

int b=2;

int c= 3;

int e = x2; //b+c+b+c

cout <<e; //10

}

Щоб не плутати аргументи #define із змінними у програмі, їх виділяють заголовними буквами. В основному #define використовується для визначення констант. Альтернативно, оголошення констант може відбуватися так:

const float c=10.2f;

const char d = 'A';

Ці константи видимі тільки усередині блоку { }.

Таким чином, директива #define є чудовим засобом для визначення цифрових та рядкових констант.

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

Директиви умовної компіляції #if, #ifdef та #ifndef застосовуються для того, щоб виключити компіляцію окремих частин програми. Це буває корисно при відладці або, наприклад, за підтримки декількох версій програми для різних платформ.

Формат директиви #if:

#if константное_выражение

[ #elif константное_выражение

[ #elif константное_выражение

.]

[ #else

.]

#endif

Кількість директив #elif – довільне. Блоки коду, що виключаються, можуть містити як описи, так і виконувані оператори. Приклад умовного включення різних версій заголовного файлу:

#if VERSION == 1

#define INCFILE "versl.h"

#elif VERSION == 2

#define INCFILE "vers2.h" / * і так далі * /

#else

#define INCFILE "versN.h"

#endif

#include INCFILE

У константних виразах може використовуватися перевірка, чи визначена константа, за допомогою defined(имя_константы), наприклад:

#if defined(__BORLANDC___)& & ___BORLANDC_ == 0x530 // Вс5.3:

typedef istream_iterator <int.char.char__traits<char>.ptrdiff__t>

istream_iter;

#elif defined(_BORLAND___)/ / BC5.2:

typedef istream_iterator<int. ptrdiff__t> istream_iter:

#else // VC5.0:

typedef istream_iterator<int> istream_iter:

#endif

Інше призначення директиви – тимчасово закоментувати фрагменти коду, наприклад:

#if 0

int i, j ;

double x, у;

#endif

Оскільки допускається вкладеність директив, такий спосіб дуже зручний.

Найчастіше в програмах використовуються директиви #ifdef та #ifndef, що дозволяють управляти компіляцією залежно від того, чи визначений за допомогою директиви #definе вказаний в них символ (хоч би як порожній рядок, наприклад, #define 32_BIT_SUPPORT):

#ifdef символ

//Розташований нижче код компілюється,

//якщо символ визначений

#ifndef символ

//Розташований нижче код компілюється,

//якщо символ не визначений

Дія цих директив розповсюджується до першого #elif, #else або #endif.

Директива #ifndef часто застосовується для того, щоб забезпечити включення заголовного файлу тільки один раз:

#ifndef HEADER_INCLUDED

#include "myheader.h"

#define HEADER_INCLUDED

#endif