Контакти

C використання аргументу main. Необов'язкові та іменовані аргументи. Налагодження програми з аргументами командного рядка

Теги: Параметри командного рядка

Параметри командного рядка

З і - компільований мову. Після складання програма являє собою виконуваний файл (ми не розглядаємо створення динамічних бібліотек, драйверів і т.д.). Наші програми дуже прості і не містять бібліотек часу виконання (Runtime libraries), тому можуть бути перенесені на комп'ютер з такою ж операційною системою (і подібної архітектурою) і там запущені.

Програма під час запуску може приймати параметри. Вони є аргументами функції main. Загальний вигляд функції main наступний

Void main (int argc, char ** argv) (...)

Першим аргументом argc є число переданих функції параметрів. Другий аргумент - масив рядків - власне самі параметри. Так як параметри у функції можуть бути будь-якими, то вони передаються як рядки, і вже сама програма повинна їх розбирати і приводити до потрібного типу.

Першим аргументом (argv) завжди є ім'я програми. При цьому ім'я виводиться в залежності від того, звідки була запущена програма.

#include #include void main (int argc, char ** argv) (printf ( "% s", argv);)

Тепер навчимося трохи працювати з командним рядком. Це знадобиться для того, щоб передавати аргументи нашій програмі. Клавіші Win + R викликає вікно "Виконати". Наберіть в ньому cmd і ви відкриєте командний рядок. Також можна знайти cmd.exe пошуком в меню Пуск. У юнікс-подібних операційних системах можна викликати програму "термінал".

Ми не будемо вивчати скільки-небудь багато команд. Тільки ті, які знадобляться в роботі.

Стандартна для всіх операційних систем команда cd здійснює перехід до потрібної папки. Існує два зарезервованих імені -. (Точка) і .. (дві крапки). Точка - це ім'я поточної папки.

Нікуди не переходить

Звернення до батьківської папки

Перехід до батьківської папки

Для переходу по потрібному пишеться cd адресу. Наприклад, потрібно перейти на windows в папку C: \\ Windows \\ System32

Cd C: \\ Windows \\ System32

В Лінуксі якщо потрібно перейти в папку / var / mysql

Cd / var / mysql

Якщо шлях містить прогалини, то він пишеться в подвійних лапках

Cd "D: \\ Docuents and Settings \\ Prolog"

Термінал має наступні корисні особливості: якщо натиснути стрілку вгору, по з'явиться попередня виконана команда. Якщо натиснути tab, то термінал спробує доповнити рядок до відомої йому команди, або доповнити шлях, перебираючи все папки і файли в цій папці.
Наберіть cd C: \\
натискайте tab і дивіться, що відбувається.

Ще одна важлива команда dir на windows і ls на linux, виводить на консоль вміст поточної папки (тієї папки, в якій ви знаходитеся в даний момент)

Ваша програма повернула своє повне ім'я. Перейдіть в папку, де розташовується ваша програма і подивіться її вміст


Тепер, після того, як ми перейшли в нашу папку, можна виконати нашу програму. Для цього наберіть її ім'я.


Зауважте - ім'я змінилося. Так як програма викликається зі своєї папки, то виводиться щодо ім'я. Тепер змінимо програму і зробимо так, щоб вона виводила всі аргументи. які їй передані.

#include #include void main (int argc, char ** argv) (int i; for (i \u003d 0; i< argc; i++) { printf("%s\n", argv[i]); } }

Зберіть проект. Перед складанням переконайтеся, що програма закрита. Тепер викличте програму, передавши їй різні аргументи. Для цього напишіть ім'я програми і через пробіл аргументи


Давайте тепер напишемо програму, яка отримує два аргументу числа і виводить їх суму

#include #include #include void main (int argc, char ** argv) (int a, b; if (argc! \u003d 3) (printf ( "Error: found% d arguments. Needs exactly 2", argc-1); exit (1); ) a \u003d atoi (argv); b \u003d atoi (argv); printf ( "% d", a + b);)

Зберемо і викличемо


Таким чином працює більшість програм. Клікнувши на ярлик, ви викликаєте програму, на яку він посилається. Більшість програм також беруть різні аргументи. Наприклад, можна викликати браузер firefox з командного рядка і передати аргументи
firefox.exe "www.mozilla.org" "сайт" і він відразу ж відкриє в двох вкладках сайти по вказаними адресами.

Багато стандартні команди також мають параметри. У windows прийнято, що вони починаються з прямого слеша, в Юнікс з мінуса або двох мінусів. наприклад

Виводить тільки папки, а в терміналі linux

Ls -l виводить всі файли і папки з зазначенням атрибутів

Для перегляду додаткових команд windows наберіть в командному рядку help або дивіться керівництво (його легко знайти в інтернеті). Для Лінукса команд і їх опцій набагато більше, а деякі з них є самостійними мовами програмування, так що варто вивчити хоча б мінімальний набір і їх опції.

Буває, що дані в програму передаються з командного рядка при її виклику. Такі дані називаються аргументами командного рядка. Виглядає це так, наприклад:

./a.out test.txt ls -lt / home / peter /

Тут викликаються програми a.out (з поточного каталогу) і ls (з одного каталогу, зазначеного у змінній оточення PATH). Перша програма з командного рядка отримує одне слово - test.txt, друга - два: -lt і / home / peter /.

Якщо програма написана на мові C, то при її запуску управління відразу передається в функцію main (), отже, саме вона отримує аргументи командного рядка, які присвоюються її змінним-параметрам.

До цього ми визначали функцію main () так, как-будто вона не приймає жодних параметри і нічого не повертає. Насправді в мові C будь-яка функція за замовчуванням (якщо не визначено нічого іншого) повертає ціле число. У цьому можна переконатися. Якщо записати код таким чином:

main () (printf ( "Hi \\ N "); return 0; )

Те ніякого попередження або помилки при компіляції не виникне. Те ж саме буде, якщо записати int main (). Це доводить, що функція за замовчуванням повертає ціле число, а не ніщо (void). Хоча те, що повертає функція завжди можна "перевизначити", наприклад, voidmain () або float main ().

При виклику програми з командного рядка в неї завжди передається пара даних:

  1. ціле число, Що позначає кількість слів (елементів, розділених пробілами) в командному рядку при виклику,
  2. покажчик на масив рядків, Де кожен рядок - це окреме слово з командного рядка.

Слід мати на увазі, що саме ім'я програми також вважається. Наприклад, якщо виклик виглядає так:

./a.out 12 theme 2

Те перший аргумент програми має значення 4, а масив рядків визначається як ( "./a.out", "12", "theme", "2").

Зверніть увагу на термінологію, є всього два аргументи програми (число і масив), але скільки завгодно аргументів командного рядка. Аргументи командного рядка "перетворюються" в аргументи програми (в аргументи функції main ()).
Ці дані (число і покажчик) передаються в програму навіть тоді, коли вона просто викликається на ім'я без передачі в неї чогось: ./a.out. У такому випадку перший аргумент має значення 1, а другий вказує на масив, що складається всього з одного рядка ( "./a.out").

Те, що в програму передаються дані, зовсім не означає, що функція main () повинна їх приймати. Якщо функція main () визначена без параметрів, то отримати доступ до аргументів командного рядка неможливо. Хоча нічого вам не заважає їх передавати. Помилки не виникне.

Щоб отримати доступ до переданих в програму даними, їх необхідно присвоїти змінним. Оскільки аргументи відразу передаються в main (), то її заголовок повинен виглядати таким чином:
main (int n, char * arr)

У першій змінної (n) міститься кількість слів, а в другій - покажчик на масив рядків. Часто другий параметр записують у вигляді ** arr. Однак це те ж саме. Згадаймо, що сам масив рядків, містить в якості своїх елементів покажчики на рядки. А в функцію ми передаємо покажчик на перший елемент масиву. Виходить, що передаємо покажчик на покажчик, тобто ** arr.

завдання
Напишіть таку програму:

#include int main (int argc, char ** argv) (int i; printf ( "% d \\ N ", Argc); for (i \u003d 0; i< argc; i++ ) puts (argv[ i] ) ; }

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

У програмі ми використовували змінні-параметри argc і argv. Прийнято використовувати саме такі імена, але насправді вони можуть бути будь-якими. Краще дотримуватися цього стандарту, щоб ваші програми були більш зрозумілі не тільки вам, а й іншим програмістам.

Практичне значення передачі даних в програму

Якщо у вас є досвід роботи в командному рядку GNU / Linux, ви знаєте, що у більшості команд є ключі і аргументи. Наприклад, при перегляді вмісту каталогів, копіювання, переміщення в якості аргументів указуються об'єкти файлової системи, Над якими виконується команда. Особливості її виконання визначаються за допомогою ключів. Наприклад, в команді

Cp -r ../les_1 ../les_101

cp - це ім'я команди, -r - ключ, а ../ les_1 і ../ les_101 - аргументи команди.

Взагалі найчастіше в програми при їх запуску передаються адреси файлів і "модифікатори" (це ключі) процесу виконання програми.

Напишемо програму, яка відкриває зазначені користувачем в командному рядку файли на запис або додавання і записує (додає) туди одну й ту ж саму інформацію, яку користувач вводить з клавіатури в процесі виконання програми:

#include #include main (int argc, char ** argv) (int i, ch; FILE * f [5]; if (argc< 3 || argc > 7) (puts ( "Помилкова кількість аргументів"); return 1; ) If (strcmp (argv [1], "-w")! \u003d 0 && strcmp (argv [1], "-a")! \u003d 0) (puts ( "Перший параметр може бути або -w, або -a"); return 2; ) For (i \u003d 0; i< argc- 2 ; i++ ) { f[ i] = fopen (argv[ i+ 2 ] , argv[ 1 ] + 1 ) ; if (f[ i] == NULL) { printf ("Файл% s не можна відкрити \\ n", Argv [i + 2]); return 3; )) While ((ch \u003d getchar ())! \u003d EOF) for (i \u003d 0; i< argc- 2 ; i++ ) putc (ch, f[ i] ) ; for (i= 0 ; i < argc- 2 ; i++ ) fclose (f[ i] ) ; return 0 ; }

Пояснення до коду:

  1. Створюється масив з п'яти файлових покажчиків. Отже можна одночасно відкрити не більше п'яти файлів. Файловий покажчик першого файлу буде зберігається в елементі масиву f, другого - в f і т.д.
  2. Перевіряється кількість аргументів командного рядка. Їх має бути не менше трьох, тому що перший - це ім'я програми, другий - режим відкриття файлу, третій - перший або єдиний файл, в який буде проводиться запис. Оскільки програма дозволяє відкрити тільки п'ять файлів, то загальне число аргументів командного рядка не може бути більше семи. Тому якщо кількість аргументів менше 3 або більше 7, то програма завершується, тому що оператор return призводить до виходу з функції, навіть якщо після нього є ще код. Що повертається з функції значення нерівне 0, може бути інтерпретовано батьківським процесом, як повідомлення про те, що програма завершилася з помилкою.
  3. Перевіряється коректність другого аргументу командного рядка. Якщо він не дорівнює ні "-w", ні "-a", то умовний вираз у другому if повертає 1 (true). Функція strcmp () дозволяє порівнювати рядки і повертає 0 в разі їх рівності.
  4. У циклі for відкриваються файли за вказаними адресами, які починаються з третього елемента масиву argv. Саме тому до i додається 2, щоб отримувати елементи масиву argv, починаючи з третього. Вираз argc-2 вказує на кількість переданих імен файлів; тому в argc зберігається загальне число аргументів командного рядка, перші два з яких не є іменами файлів.
  5. Вираз argv + 1 дозволяє "вирізати" з рядка "-w" (або "-a") підрядок "w" (або "a"), тому що argv по суті покажчик на перший елемент рядка. Додаючи до покажчика одиницю, ми зміщуємо його до наступного елементу масиву.
  6. Якщо файл відрити не вдається, то функція fopen () повертає NULL. В такому випадку програма завершується.
  7. Кожен символ, введений користувачем з клавіатури, записується в усі відкриті файли.
  8. В кінці файли закриваються.

Необов'язкові та іменовані аргументи

необов'язкові аргументи

У версії C # 4.0 впроваджено новий засіб, що підвищує зручність вказівки аргументів при виклику методу. Це засіб називається необов'язковими аргументами і дозволяє визначити використовується за умовчанням значення для параметра методу. Дане значення буде використовуватися за замовчуванням в тому випадку, якщо для параметра не вказано відповідний аргумент при виклику методу. Отже, вказувати аргумент для такого параметра не обов'язково. Необов'язкові аргументи дозволяють легко зможете зателефонувати методів, де до деяких параметрів застосовуються аргументи, які обираються за замовчуванням. Їх можна також використовувати в якості "скороченою" форми перевантаження методів.

Головним стимулом для додавання необов'язкових аргументів послужила необхідність у спрощенні взаємодії з об'єктами СОМ. У декількох об'єктних моделях Microsoft (наприклад, Microsoft Office) Функціональність надається через об'єкти СОМ, багато з яких були написані давно і розраховані на використання необов'язкових параметрів.

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

Using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 (class Program (// Аргументи b і з вказувати при виклику необов'язково static int mySum (int a, int b \u003d 5, int c \u003d 10) (return a + b + c;) static void Main () (int sum1 \u003d mySum (3); int sum2 \u003d mySum (3,12); Console.WriteLine ( "Sum1 \u003d" + sum1); Console.WriteLine ( "sum2 \u003d" + sum2); Console.ReadLine ();)))

Слід мати на увазі, що всі необов'язкові аргументи повинні неодмінно зазначатися праворуч від обов'язкових. Крім методів, необов'язкові аргументи можна застосовувати в конструкторах, індексатора і делегатів.

Перевага необов'язкових аргументів полягає, зокрема, в тому, що вони спрощують програмує звернення зі складними викликами методів і конструкторів. Адже нерідко в методі доводиться ставити більше параметрів, ніж зазвичай потрібно. І в подібних випадках деякі з цих параметрів можуть бути зроблені необов'язковими завдяки акуратному застосування необов'язкових аргументів. Це означає, що передавати потрібно лише ті аргументи, які важливі в даному конкретному випадку, а не всі аргументи, які в іншому випадку повинні бути обов'язковими. Такий підхід дозволяє раціоналізувати метод і спростити програмує поводження з ним.

іменовані аргументи

ще однією функціональної можливістю, Яка додалася в C # з виходом версіі.NET 4.0, є підтримка так званих іменованих аргументів (named arguments). Як відомо, при передачі аргументів методу порядок їх слідування, як правило, повинен збігатися з тим порядком, в якому параметри визначені в самому методі. Іншими словами, значення аргументу присвоюється параметру по його позиції в списку аргументів.

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

імя_параметра: значення

тут імя_параметра позначає ім'я того параметра, якому передається значення. Зрозуміло, імя_параметра має позначати ім'я дійсного параметра для викликається методу.

При створенні консольного застосування в мові програмування С ++, автоматично створюється рядок дуже схожа на цю:

Int main (int argc, char * argv) // параметри функції main ()

Цей рядок - заголовок головної функції main (), в дужках оголошені параметри argс і argv. Так ось, якщо програму запускати через командний рядок, то існує можливість передати будь-яку інформацію з цією програмою, для цього й існують параметри argc і argv. Параметр argc має тип даних int, і містить кількість параметрів, переданих у функцію main. Причому argc завжди не менш 1, навіть коли ми не передаємо ніякої інформації, так як першим параметром вважається ім'я функції. Параметр argv це масив покажчиків на рядки. Через командний рядок можна передати тільки дані строкового типу. Покажчики і рядки - це дві великі теми, під які створені окремі розділи. Так ось саме через параметр argv і передається будь-яка інформація. Розробимо програму, яку будемо запускати через командну рядок Windows, І передавати їй деяку інформацію.

// argc_argv.cpp: визначає точку входу для консольного застосування. #include "stdafx.h" #include using namespace std; int main (int argc, char * argv) (if (argc\u003e<< argv<

// код Code :: Blocks

// код Dev-C ++

// argc_argv.cpp: визначає точку входу для консольного застосування. #include using namespace std; int main (int argc, char * argv) (if (argc\u003e 1) // якщо передаємо аргументи, то argc буде більше 1 (в залежності від кількості аргументів) (cout<< argv<

Після того як налагодили програму, відкриваємо командний рядок Windows і перетягуємо в вікно командного рядка екзешнік нашої програми, в командному рядку відобразиться повний шлях до програми (але можна прописати шлях до програми в ручну), після цього можна натискати ENTER і програма запуститься (див. Малюнок 1).

Малюнок 1 - Параметри функції main

Так як ми просто запустили програму і не передавали їй ніяких аргументів, з'явилося повідомлення Not arguments. На малюнку 2 зображений запуск цієї ж програми через командний рядок, але вже з передачею їй аргументу Open.

Малюнок 2 - Параметри функції main

Аргументом є слово Open, як видно з малюнка, це слово з'явилося на екрані. Передавати можна кілька параметрів відразу, відокремлюючи їх між собою комою. Якщо необхідно передати параметр складається з декількох слів, то їх необхідно взяти в подвійні лапки, і тоді ці слова будуть вважатися як один параметр. Наприклад, на малюнку зображений запуск програми, з передачею їй аргументу, що складається з двох слів - It work.

Малюнок 3 - Параметри функції main

А якщо прибрати лапки. Те побачимо тільки слово It. Якщо не планується передавати будь-яку інформацію при запуску програми, то можна видалити аргументи в функції main (), також можна змінювати імена даних аргументів. Іноді зустрічається модифікації параметрів argc і argv, але це все залежить від типу створюваного додатка або від середовища розробки.

В програми на мові Сі можна передавати деякі аргументи. Коли спочатку обчислень проводиться звернення до main (), їй передаються три параметра. Перший з них визначає число командних аргументів при зверненні до програми. Другий являє собою масив покажчиків на символьні рядки, що містять ці аргументи (в одному рядку - один аргумент). Третій теж є масивом покажчиків на символьні рядки, він використовується для доступу до параметрів операційної системи (до змінних оточення).

Будь-яка така рядок представляється у вигляді:

змінна \u003d значення \\ 0

Останній рядок можна знайти за двома заключним нулях.

Назвемо аргументи функції main () відповідно: argc, argv і env (можливі і будь-які інші імена). Тоді припустимі наступні опису:

main (int argc, char * argv)

main (int argc, char * argv, char * env)

Припустимо, що на диску A: є деяка програма prog.exe. Звернемося до неї в такий спосіб:

A: \\\u003e prog.exe file1 file2 file3

Тоді argv - це покажчик на рядок A: \\ prog.exe, argv - на рядок file1 і т.д. На перший фактичний аргумент вказує argv, а на останній - argv. Якщо argc \u003d 1, то після імені програми в командному рядку параметрів немає. У нашому прикладі argc \u003d 4.

рекурсія

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

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

Бібліотечні функції

У системах програмування підпрограми для вирішення часто зустрічаються завдань об'єднуються в бібліотеки. До числа таких завдань відносяться: обчислення математичних функцій, введення / виведення даних, обробка рядків, взаємодію із засобами операційної системи та ін. Використання бібліотечних підпрограм позбавляє користувача від необхідності розробки відповідних засобів і надає йому додатковий сервіс. Включені в бібліотеки функції поставляються разом з системою програмування. Їх оголошення дані в файлах * .h (це так звані включаються або заголовки). Тому, як уже згадувалося вище, на початку програми з бібліотечними функціями повинні бути такі рядки:

#include<включаемый_файл_типа_h>

наприклад:

#include

Існують також засоби для розширення і створення нових бібліотек з програмами користувача.

Для глобальних змінних відводиться фіксований місце в пам'яті на все час роботи програми. Локальні змінні зберігаються в стеці. Між ними знаходиться область пам'яті для динамічного розподілу.

Функції malloc () і free () використовуються для динамічного розподілу вільної пам'яті. Функція malloc () виділяє пам'ять, функція free () звільняє її. Прототипи цих функцій зберігаються в заголовки stdlib.h і мають вигляд:

void * malloc (size_t size);

void * free (void * p);

Функція malloc () повертає покажчик типу void; для правильного використання значення функції треба перетворити до покажчика на відповідний тип. При успішному виконанні функція повертає покажчик на перший байт вільної пам'яті розміру size. Якщо достатньої кількості пам'яті немає, повертається значення 0. Щоб визначити кількість байтів, необхідних для змінної, використовують операцію sizeof ().

Приклад використання цих функцій:

#include

#include

p \u003d (int *) malloc (100 * sizeof (int)); / * Виділення пам'яті для 100

цілих чисел * /

printf ( "Пам'ять майже вичерпано \\ n");

for (i \u003d 0; i< 100; ++i) *(p+i) = i; /* Использование памяти */

for (i \u003d 0; i< 100; ++i) printf("%d", *(p++));

free (p); / * Звільнення пам'яті * /

Перед використанням покажчика, що повертається malloc (), необхідно переконатися, що пам'яті досить (покажчик не нульовий).

препроцесор

Препроцесор Сі - це програма, яка обробляє вхідні дані для компілятора. Препроцесор переглядає вихідну програму і виконує наступні дії: підключає до неї задані файли, здійснює підстановки, а також управляє умовами компіляції. Для препроцесора призначені рядки програми, що починаються з символу #. В одному рядку дозволяється записувати тільки одну команду (директиву препроцесора).

Директива

#define ідентифікатор підстановка

викликає заміну в наступному тексті програми названого ідентифікатора на текст підстановки (зверніть увагу на відсутність крапки з комою в кінці цієї команди). По суті, ця директива вводить макроозначень (макрос), де "ідентифікатор" - це ім'я макроозначення, а "підстановка" - послідовність символів, на які препроцесор заміняє вказане ім'я, коли знаходить його в тексті програми. Ім'я макроозначення прийнято набирати прописними буквами.

Розглянемо приклади:

Перший рядок викликає заміну в програмі ідентифікатора MAX на константу 25. Друга дозволяє використовувати в тексті замість відкриває фігурної дужки (() слово BEGIN.

Відзначимо, що оскільки препроцесор не перевіряє сумісність між символічними іменами макроозначень і контекстом, в якому вони використовуються, то рекомендується такого роду ідентифікатори визначатимуть не директивою #define, а за допомогою ключового слова const з явним зазначенням типу (це більшою мірою відноситься до Сі + +):

const int MAX \u003d 25;

(Тип int можна не вказувати, так як він встановлюється за умовчанням).

Якщо директива #define має вигляд:

#define ідентифікатор (ідентифікатор, ..., ідентифікатор) підстановка

причому між першим ідентифікатором і відкриває круглою дужкою немає пробілу, то це визначення макропідстановки з аргументами. Наприклад, після появи рядка виду:

#define READ (val) scanf ( "% d", & val)

оператор READ (y); сприймається так само, як scanf ( "% d", & y) ;. Тут val - аргумент і виконана макропідстановка з аргументом.

При наявності довгих визначень в підстановці, що продовжуються в наступному рядку, в кінці чергового рядка з продовженням ставиться символ \\.

У макровизначеннями можна поміщати об'єкти, розділені знаками ##, наприклад:

#define PR (x, у) x ## y

Після цього PR (а, 3) викличе підстановку а3. Або, наприклад, макроозначень

#define z (a, b, c, d) a (b ## c ## d)

приведе до заміни z (sin, x, +, y) на sin (x + y).

Символ #, що поміщається перед макроаргументом, вказує на перетворення його в рядок. Наприклад, після директиви

#define PRIM (var) printf (#var "\u003d% d", var)

наступний фрагмент тексту програми

перетвориться так:

printf ( "year" "\u003d% d", year);

Наведемо інші директиви препроцесора. Директива #include вже зустрічалася раніше. Її можна використовувати в двох формах:

#include "ім'я файлу"

#include<имя файла>

Дія обох команд зводиться до включення в програму файлів з вказаним ім'ям. Перша з них завантажує файл з поточного або заданого в якості префікса каталогу. Друга команда здійснює пошук файлу в стандартних місцях, визначених у системі програмування. Якщо файл, ім'я якого записано в подвійних лапках, не знайдений у вказаному каталозі, то пошук буде продовжено у підкаталогах, заданих для команди #include<...>. Директиви #include можуть вкладатися одна в іншу.

Наступна група директив дозволяє вибірково компілювати частини програми. Цей процес називається умовною компіляцією. У цю групу входять директиви #if, #else, #elif, #endif, #ifdef, #ifndef. Основна форма запису директиви #if має вигляд:

#if константное_вираженіе последовательность_операторов

Тут перевіряється значення константного виразу. Якщо воно істинне, то виконується задана послідовність операторів, а якщо помилково, то ця послідовність операторів пропускається.

Відповідають вимогам Директиви ЄС #else подібна до дії команди else в мові Сі, наприклад:

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

последовательность_операторов_2

Тут якщо константне вираз істинний, то виконується последовательность_операторов_1, а якщо помилково - последовательность_операторов_2.

Директива #elif означає дію типу "else if". Основна форма її використання має вигляд:

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

последовательность_операторов

#elif константное_вираженіе_1

последовательность_операторов_1

#elif константное_вираженіе_n

последовательность_операторов_n

Ця форма подібна до конструкції мови Сі виду: if ... else if ... else if ...

Директива

#ifdef ідентифікатор

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

#ifndef ідентифікатор

перевіряє чи є невизначеним в даний момент зазначений ідентифікатор. За будь-якої з цих директив може слідувати довільне число рядків тексту, можливо, містять інструкцію #else (#elif використовувати не можна) і закінчуються рядком #endif. Якщо перевіряється умова істинно, то ігноруються всі рядки між #else і #endif, а якщо помилково, то рядки між перевіркою і #else (якщо слова #else немає, то #endif). Директиви #if і #ifndef можуть "вкладатися" одна в іншу.

Директива виду

#undef ідентифікатор

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

Розглянемо приклади. Три наступні директиви:

перевіряють чи визначено ідентифікатор WRITE (тобто чи була команда виду #define WRITE ...), і якщо це так, то ім'я WRITE починає вважатися невизначеним, тобто що не підлягає заміні.

директиви

#define WRITE fprintf

перевіряють чи є ідентифікатор WRITE невизначеним, і якщо це так, то визначаться ідентифікатор WRITE замість імені fprintf.

Директива #error записується в такій формі:

#error сообщеніе_об_ошібке

Якщо вона зустрічається в тексті програми, то компіляція припиняється і на екран дисплея виводиться повідомлення про помилку. Ця команда в основному застосовується на етапі налагодження. Зауважимо, що повідомлення про помилку не треба укладати в подвійні лапки.

Директива #line призначена для зміни значень змінних _LINE_ і _FILE_, визначених у системі програмування Сі. Мінлива _LINE_ містить номер рядка програми, виконуваної в поточний момент часу. Ідентифікатор _FILE_ є покажчиком на рядок з ім'ям модульна програми. Директива #line записується в такий спосіб:

#line номер "имя_файла"

Тут номер - це будь-яке позитивне ціле число, яке буде призначено змінної _LINE_, имя_файла - це необов'язковий параметр, який перекриває значення _FILE_.

Директива #pragma дозволяє передати компілятору деякі вказівки. Наприклад, рядок

говорить про те, що в програмі на мові Сі є рядки на мові асемблера. наприклад:

Розглянемо деякі глобальні ідентифікатори або макроімена (імена макроозначень). Визначено п'ять таких імен: _LINE_, _FILE_, _DATE_, _TIME_, _STDC_. Два з них (_LINE_ і _FILE_) вже описувалися вище. Ідентифікатор _DATE_ визначає рядок, в якій зберігається дата трансляції вихідного файлу в об'єктний код. Ідентифікатор _TIME_ задає рядок, що зберігає час трансляції вихідного файлу в об'єктний код. Макрос _STDC_ має значення 1, якщо використовуються стандартно - певні макроімена. В іншому випадку ця змінна не буде визначена.



Сподобалася стаття? поділіться їй