C установка IDE C структура програми C змінні C типи даних С функція printf C константи C арифметичні операції C операції порівняння і логічні операції C порозрядні операції C операції присвоювання C перетворення типів C умовні конструкції C цикли С масиви і рядки С функція scanf C препроцесор. Директива #include C #define директива C макроси C умовна компіляція C функції. Визначення та опис функцій C функції. Передача параметрів в функцію C функції. Повернення результату з функції C функції. Рекурсивні функції C область видимості змінних C зовнішні об'єкти C вказівники C вказівник. Операції з вказівниками C покажчики. Арифметика покажчиків C покажчики. Константи і покажчики C покажчики. Покажчики та масиви C покажчики. Масиви покажчиків, рядки і багаторівнева адресація C покажчики. Покажчики в параметрах функції C покажчики. Динамічна пам'ять C покажчики. Покажчик як результат функції C покажчики. Управління динамічної пам'яттю C покажчики. Покажчики на функцію C покажчики. Покажчики на функції як параметри і результати функцій C покажчики. Функції зі змінною кількістю параметрів C struct. Визначення структур C struct. Структури як елементи структур C struct. Покажчики на структури C struct. Масиви структур C struct. Структури і функції C struct. union об'єднання C struct. Бітові поля С file. Введення-виведення і робота з файлами C file. Читання і запис бінарних файлів C file. Читання і запис структур в файл C file. Читання і запис текстових файлів C file. Форматування вводу-виводу C file. Позиціонування в потоці C file. Консольне введення-виведення

C препроцесор. Директива #include


препроцесор

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

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

Ми можемо використовувати такі директиви:

  • #define : визначає макрос або препроцесорний ідентифікатор

  • #undef : скасовує ухвалу макросу або ідентифікатора

  • #ifdef : перевіряє, чи визначено ідентифікатор

  • #ifndef : перевіряє невизначеності ідентифікатор

  • #include : включає текст з файлу

  • #if : перевіряє умову виразу (як умовна конструкція if)

  • #else : задає альтернативну умова для #if

  • #endif : закінчення умовної директиви #if

  • #elif : задає альтернативну умову для #if

  • #line : змінює номер наступного нижче рядка

  • #error : формує текст повідомлення про помилку трансляції

  • #pragma : визначає дії, які залежать від конкретної реалізації компілятора

  • # : Порожня директива, по суті нічого не робить

Розглянемо основні з цих директив.


Директива #include. Включення файлів

Раніше вже використовувалася директива #include . Ця директива підключає в вихідний текст файли. Вона має такі форми застосування:

#include <імя_файла>        // імя файла в < > скобках
#include "імя_файла"        // імя файла в " " кавичках

Наприклад, якщо нам треба задіяти в додатку консольне введення-виведення за допомогою функцій printf() або scanf() , то нам треба підключити файл " stdio.h ", який містить визначення цих функцій:

#include <stdio.h>

При виконанні цієї директиви препроцесор вставляє текст файлу stdio.h . Даний файл ще називається заголовним. Заголовки містять прототипи функцій, визначення і опис типів і констант і мають розширення .h .

Пошук файлу здійснюється в стандартних системних каталогах. Взагалі є стандартний набір вбудованих заголовків файлів, який визначається стандартом мови і які ми можемо використовувати:

  • assert.h : відповідає за діагностику програм

  • complex.h : для роботи з комплексними числами

  • ctype.h : відповідає за перетворення і перевірку символів

  • errno.h : відповідає за перевірку помилок

  • fenv.h : для доступу до оточення, яке управляє операціями з числами з плаваючою точкою

  • float.h : відповідає за роботу з числами з плаваючою точкою

  • inttypes.h : для роботи з великими цілими числами

  • iso646.h : містить ряд визначень, які розширюють ряд логічних операцій

  • limits.h : містить граничні значення цілочисельних типів

  • locale.h : відповідає за роботу з локальною культурою

  • math.h : для роботи з математичними виразами

  • setjmp.h : визначає можливості нелокальних переходів

  • signal.h : для обробки виняткових ситуацій

  • stdalign.h : для вирівнювання типів

  • stdarg.h : забезпечує підтримку змінного числа параметрів

  • stdatomic.h : для виконання атомарних операцій по даних, що розділяються між потоками

  • stdbool.h : для роботи з типом _Bool

  • stddef.h : містить ряд допоміжних визначень

  • stdint.h : для роботи з цілими числами

  • stdio.h : для роботи із засобами введення-виведення

  • stdlib.h : містить визначення і прототипи функцій загального користування

  • stdnoreturn.h : містить макрос noreturn

  • string.h : для роботи з рядками

  • tgmath.h : підключає math.h і complex.h плюс додає додаткові можливості по роботі з математичними обчисленнями

  • threads.h : для роботи з потоками

  • time.h : для роботи з датами і часом

  • uchar.h : для роботи з символами в кодуванні Unicode

  • wchar.h : для роботи з символами

  • wctype.h : містить додаткові можливості для роботи з символами

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

Крім стандартних заголовків файлів ми можемо підключати і свої файли. Наприклад, в тій же папці, де знаходиться головний файл програми, визначимо ще один файл, який назвемо main.c . Визначимо в ньому наступний код:

int number = 5;

Тут просто визначена одна змінна. Тепер підключимо цей файл в програму:

#include <stdio.h>
#include "main.c"
 
int main(void)
{
    printf("%d", number);   // 5
    return 0;
}

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

У той же час даний спосіб прекрасно працює в GCC. Але для різних середовищ програмування спосіб підключення файлів може відрізнятися. Наприклад, в Visual Studio ми отримаємо помилку. І більш правильний підхід буде полягати в тому, що визначити оголошення об'єкта (змінної / константи) або функції в додатковому заголовку, а визначення об'єкта або функції потрібно помістити в стандартний файл з розширенням .c .

Наприклад, в нашому в файлі main.c вже є визначення змінної number . Тепер в ту ж папку додамо новий файл main.h - файл з такою самою назвою, але іншим розширенням. І визначимо в main.h наступний код:

extern int number;

Ключове слово extern вказує, що даний об'єкт є зовнішнім. І в цьому випадку ми могул б його підключити в файл вихідного коду:

#include <stdio.h>
#include "main.h"       // объявление или описание объекта
#include "main.c"       // определение объекта
 
int main(void)
{
    printf("%d", number);
    return 0;
}

Цей приклад також буде працювати в GCC, проте як вже було розглянуто вище, підключення файлу main.h для GCC необов'язково.

Якщо розробка ведеться в Visual Studio , то для визначення об'єкта не треба підключати вихідний файл:

#include <stdio.h>
#include "main.h"       // оголошення або опис обєкта
 
int main(void)
{
    printf("%d", number);
    return 0;
}

Незважаючи на те, що тут явно не підключається файл main.c , але при трансляції Visual Studio через заголовки main.h можна підключити знайдений в тій же папці файл main.c .


Наш партнер:
beta test mp3 playlist downloader