Компонування, бібліотеки та заголовки, програмування на c і c
При створенні компілятора С або С ++ вирішувалися два завдання. По-перше, розроблявся сам компілятор. По-друге, створювалася бібліотека функцій. Оскільки в бібліотеці Borland міститься дуже багато функцій, можна не сумніватися, що її створення зажадало від програмістів серйозних зусиль. (Одне тільки опис цих функцій займає кілька сотень сторінок!) Будь-яка С або С ++ програма спирається на ці функції при виконанні безлічі завдань. У зв'язку з таким фундаментальної ролі бібліотеки для виконання програм важливо познайомитися з описом її роботи. Зокрема, необхідно розібратися в роботі компоновщика, зрозуміти, чим бібліотеки відрізняються від об'єктних файлів і яка роль заголовків файлів. Ці питання і розглядаються нижче.
Компоновщик (LINKER)
файл 1
int count;
extern void display (void);
int main (void)
count = 10;
display ();
return 0;
>
файл 2
#include
extern int count;
void display (void)
printf ( ".", count);
>
Подібним же чином компоновщик «повідомляє» файлу One, де розташовується функція display, щоб її можна було викликати.
Бібліотечні файли в порівнянні з об'єктними файлами
Хоча бібліотеки і схожі на об'єктні файли, між ними є велика різниця: при зверненні до бібліотеки до програми додається не весь код, наявний в бібліотеці. Коли компоновщик обробляє програму, що складається з декількох об'єктних файлів, пів-ний код кожного об'єктного файлу стає частиною результуючої виконуваної програм-ми. Це відбувається незалежно від того, чи буде в дійсності використовуватися цей код. Інакше кажучи, компонувальник при формуванні програми просто об'єднує разом все об'єкт-ні файли. З бібліотечними файлами інша справа.
Бібліотека являє собою зібрання функцій. На відміну від об'єктних файлів в бібліо-Тічна файлі зберігається назва кожної функції, об'єктний код функції і інформація, ка-сающаяся «переміщуваності» файлу, необхідна для редагування зв'язків. Коли програма робить посилання на функцію, що міститься в бібліотеці, компонувальник шукає цю функцію і додає її код до програми. Таким чином, до програми додаються тільки ті функції, які дійсно будуть в ній використовуватися.
Оскільки функції зберігаються в бібліотеці, то в виконуваний код програми увійдуть лише дійсно використовуються в програмі функції. (Якби вони входили до складу об'єкт-них файлів, програма була б довшою на кілька сот кілобайт!)
заголовки
Багато бібліотечні функції працюють зі своїми особливими типами даних і зі структурами, до яких програма повинна мати доступ. Ці структури і типи визначаються в заголовних файлах, що поставляються з компілятором, і вони (заголовки) повинні включатися (з по-міццю #include) в кожен файл, який використовує функції, на які вони посилаються. Крім того, у всіх бібліотечних функцій є прототипи, певні в заголовки. Це зроблено з двох причин. По-перше, в (С ++ всі функції повинні мати прототипи. По-друге, хоча в С створення прототипів і не є обов'язковим, їх використання настоятель-но рекомендовано, оскільки воно забезпечує засіб для більш ретельного контролю типів. Включаючи в С- програму заголовки, які відповідають стандартним функ-ціям програми, можна виявити потенційні помилки розбіжності типів. Наприклад, включення string.h (заголовки для роботи з функціями обробки рядків) в нижченаве--дме код призведе до видачі при компіляції ін дупреждения:
#include
char s1 [20] = "hello";
char s2 [] = "there.";
int main (void)
int p;
p = strcat (s1, s2);
return 0;
>
Оскільки функція strcat () в заголовки оголошена як повертає покажчик на char, то компілятор може зареєструвати як потенційну помилку привласнення целочіс-ленній змінної р значення цього покажчика.
Необхідно пам'ятати: хоча в С включення багатьох заголовків файлів технічно не є обов'язковим (хоча і рекомендується), вони повинні включатися в усі С ++ - програми. В посліду-ющих розділах в описі кожної функції буде вказуватися її заголовки.
Кілька з найбільш уживаних заголовних файлів наведені в таблиці. У таблиці позначені файли, певні стандартом ANSI С і використовуються мовою С ++.
Таблиця: Найбільш вживані заголовки
Функції динамічного виділення пам'яті