KNOW INTUIT, Лекция, Програми на език C, състоящи се от няколко файла
Теоретична част
Програмата на езикаCе набор от функции. Стартирането на всяка програма започва със стартирането на основната функция, която съдържа останалата част от програмата. Вътре в основната функция се извикват всички други необходими функции, за да реализират дадения алгоритъм. Някои от функциите се създават от самия програмист, другата част - библиотечните функции - се доставят на потребителя със средата за програмиране и се използват в процеса на разработване на програми (например printf(), sqrt() и др.).
Най-простият метод за използване на множество функции е да ги поставите в един и същи файл. След това този файл се компилира, сякаш съдържа една функция [17.1]. Други подходи за решаване на този проблем са значително зависими от конкретната операционна система (Unix-подобни системи, Windows, Macintosh). Компилаторите на операционните системи Windows и Macintosh са проектно-ориентирани компилатори [17.1]. Проектът описва ресурсите, използвани от програмата. Тези ресурси включват файлове с изходен код.
Ако поставите основната функция main() в един файл и собствените дефиниции на функциите на програмиста във втори файл, тогава първият файл се нуждае от прототипи на функции. За да направите това, можете да съхранявате прототипи на функции в един от заглавните файлове.
Добрата практика на програмиране препоръчва поставяне на прототипи на функции и деклариране на техните константи в заглавен файл [17.1]. Присвояването на отделни задачи към отделни функции допринася за подобренията на програмата.
Функциите gamma() и delta() могат да се използват от функции от други файлове, които са част от програмата, докато beta() не могат. Поради това използването на функцията beta() е ограничено до еднафайл, така че функции със същото име могат да се използват в други файлове. Една от причините за използването на статичен клас за съхранение е да се направят функциите частни за конкретни модули, което избягва сблъсъци на имена в много случаи [17.1].
Едно от златните правила за надеждно програмиране е принципът"трябва да се знае"или принципът на минималния необходим обхват [17.1]. Препоръчително е да поддържате всички вътрешни работи на всяка функция възможно най-затворени за други функции, като споделяте само тези променливи, които не могат да бъдат премахнати според логиката на програмата. Други класове за съхранение са полезни и могат да се използват. Винаги обаче трябва да си задаваме въпроса: има ли нужда от това?
Свързването описвастепента(обхват, пространство), в рамките на която променлива, дефинирана в една част от програмата, може да бъде обвързана с всяка друга част от програмата. Променлива с блоков обхват, тъй като е локална, няма обвързване. Променлива с обхват на файл има вътрешно или външно обвързване.Вътрешно свързванеозначава, че променливата може да се използва във файла, съдържащ нейната дефиниция.Външно свързванеозначава, че променливата може да се използва в други файлове.
Езиковият стандартCподдържа 4 спецификатора на клас за съхранение [17.2]:
- външен
- статичен
- регистрирам
- Автоматичен
Нека дадем описание на спецификаторите на класа за съхранение [17.2].
външен спецификатор
В езикаC, когато редактирате връзки, едно от трите свързвания може да бъде приложено към променлива: вътрешно, външно или нито едно от тези типове.По принцип външното свързване се прилага към имената на функциите и глобалните променливи. Това означава, че след свързване те ще бъдат достъпни във всички файлове, съставляващи програмата. Обектите, декларирани със статичния спецификатор и видими на ниво файл, са вътрешно свързани и ще бъдат достъпни само във файла, в който са декларирани след свързване. Локалните променливи не са обвързани и следователно са достъпни само в техните блокове.
Спецификаторът extern показва, че обектът е външно обвързан, поради което те ще бъдат достъпни в цялата програма.Декларация(декларация) декларира името и типа на обекта.Описание(дефиниция, определение) заделя област от паметта за обект, където ще бъде разположен. Един и същи обект може да бъде деклариран многократно на различни места, но може да бъде деклариран само веднъж.
Пример за използване на extern спецификатора при използване на глобални променливи:
При компилиранесе спазват следните правила:
Спецификаторът extern играе голяма роля в програми, които се състоят от много файлове [17.3]. В езикаCедна програма може да бъде написана в няколко файла, които се компилират отделно и след това се свързват в един. В този случай е необходимо по някакъв начин да кажете на всички файлове за глобалните променливи на програмата. Най-добрият (и най-преносим) начин да направите това е да дефинирате (декларирате) всички глобални променливи в един файл и да ги декларирате с extern спецификатора в останалите файлове, например, както се прави в следната програма:
Първи файл (main.c) | Втори файл (second.h) |
В една програма първият файл е основната част от софтуерния проект. Вторият файл е създаден катотекстов файл (с помощта на бележник) с разширение *.h . Списъкът с глобални променливи (x, y, ch) се копира от първия файл във втория и след това се добавя спецификаторът extern. Той казва на компилатора, че имената и типовете на променливите, които следват, са декларирани другаде. Всички препратки към външни променливи се разпознават по време на редактиране на връзката. Връзката на втория файл е направена с името на диска (D:), на който се намира файлътsecond.h. За да включите име на файл, създадено от потребителя, оградете го в двойни кавички. Резултатът от изпълнението на програмата е показан на фиг. 17.1 Друг начин, реализиран в Microsoft Visual Studio 2010, е незабавно да изберете"Нов""Файл"чрез елемента от менюто"Файл"и след това да изберетеVisual C++Заглавен файл (.h)в списъка с инсталирани шаблони. Прозорецът, показан на фиг. 17.2. След това в долния десен ъгъл натиснете клавишаOpen. Отваря се празно поле - място за набиране на необходимия код. По подразбиране този файл се наричаHeader1.h. Когато пресъздадете заглавния файл, той ще бъдеHeader2.hи т.н. След като напишете кода, можете да запишете този заглавен файл по желание във всяка директория с произволно (валидно) име (и разширението остава.h). |