русс | укр

Мови програмуванняВідео уроки php mysqlПаскальСіАсемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование


Linux Unix Алгоритмічні мови Архітектура мікроконтролерів Введення в розробку розподілених інформаційних систем Дискретна математика Інформаційне обслуговування користувачів Інформація та моделювання в управлінні виробництвом Комп'ютерна графіка Лекції


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


Дата додавання: 2015-01-08; переглядів: 1040.


 

Препроцесором в мові C ++ називається попередній етап компіляції, що формує остаточний варіант тексту програми. У мові С#, нащадку С++, препроцесор практично відсутній, але деякі директиви збереглися. Призначення директив - виключати з процесу компіляції фрагменти коду при виконанні певних умов, виводити повідомлення про помилки і попередження, а також структурувати код програми. Кожна директива розташовується на окремому рядку і не закінчується крапкою з комою, на відміну від операторів мови. У одному рядку з директивою може розташовуватися тільки коментар виду //. Перелік і короткий опис директив приведені в таблиці 12.4.

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

Таблиця 12.4

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

 

Найменування Опис
#define, #undef   Визначення (наприклад, #define DEBUG) і відміна визначення (#undef DEBUG) символьної константи, яка використовується директивами умовної компіляції. Директиви розміщуються до першої лексеми одиниці компіляції. Допускається повторне визначення однієї і тієї ж константи
#if,#elif, #else, #endif Директиви умовної компіляції. Код, що знаходиться в області їх дії, компілюється або пропускається залежно від того, чи була раніше визначена символьна константа
#line   Завдання номера рядка і імені файлу, про який видаються повідомлення, що виникають при компіляції (наприклад, #line 200 "ku_ku.txt"). При цьому в діагностичних повідомленнях компілятора ім'я компільованого файлу замінюється вказаним, а рядки нумеруються, починаючи із заданого першим параметром номера
  # error, #warning Виведення при компіляції повідомлення, вказаного в рядку директиви. Після виконання директиви компіляція припиняється (наприклад, #error Далі компілювати не можна). Після виконання директиви #warning компіляція продовжується
#region, #endregion Визначення фрагмента коду, який можна буде скрутити або розвернути засобами редактора коду. Фрагмент розташовується між цими директивами
#pragma   Дозволяє відключити (#pragma warning disable) або відновити (#pragma warning restore ) видачу всіх або перерахованих в директиві попереджень компілятора

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

 

# константний_вираз

[ #elif константний_вираз

...]

[ #elif константний_вираз

...]

[ #else

... ]

#endif

 

Кількість директив #elif довільна. Блоки коду, що виключаються, можуть містити як описи, так і виконуваних операторів. Константний вираз може містити одну або декілька символьних констант, об'єднаних знаками операцій = =, !=, !, && і ||. Також допускаються круглі дужки. Константа вважається рівною true, якщо вона була раніше визначена за допомогою директиви #define. Приклад застосування директив приведений на лістингу 12.4.

 

Лістинг 12.4. Застосування директив умовної компіляції

 

// #define VAR1

// #define VAR2

 

using System;

 

namespace ConsoleApplication1

{

class Classl

{

#if VAR1

 

static void F(){ Console.WriteLine( "Вариант 1" ): }

#elif VAR2

static void F(){ Console.WriteLine( "Вариант 2" ); }

#else

static void F(){ Console.WriteLine( "Основной вариант" ); }

#endif

static void Main()

{

F();

}

}

}

Залежно від того, визначення якої символьної константи розкоментувати, в компіляції братиме участь один з трьох методів F.

Директива #define застосовується не тільки у поєднанні з директивами умовної компіляції. Можна застосовувати її разом із стандартним атрибутом Conditional для умовного управління виконанням методів. Метод виконуватиметься, якщо константа визначена. Приклад приведений в лістингу 12.5. Зверніть увагу на те, що для застосування атрибуту необхідно підключити простір імен System.Diagnostics.

 

Лістинг 12.5. Використання атрибуту Conditional

 

// #define VAR1

#define VAR2

using System;

using System.Diagnostics;

 

namespace ConsoleApplication1

{

class Classl

{

[Conditional ("VAR1")]

static void A(){ Console.WriteLine( " Виконується метод A" ); }

[Conditional ("VAR2")]

static void B(){ Console.WriteLine( " Виконується метод В" ); }

 

static void Main()

{

A(); B();

}

}

}

 

У методі Main записані виклики обох методів, проте в даному випадку буде виконаний тільки метод В, оскільки символьна константа Var1 не визначена.

 



<== попередня лекція | наступна лекція ==>
Простір імен | Абстрактні структури даних


Онлайн система числення Калькулятор онлайн звичайний Науковий калькулятор онлайн