У програмуванні оголошення () у синтаксичній мовній конструкції — це процес визначення властивостей ідентифікатора для його ініціалізації: воно визначає значення слова (ідентифікатора).«Оголошення визначає інтерпретацію та атрибути набору ідентифікаторів. Визначення ідентифікатора — це оголошення цього ідентифікатора, яке: для об'єкта [змінної або константи] спричиняє резервування сховища для цього об'єкта; для функції містить тіло функції; для константи переліку є (єдиним) оголошенням ідентифікатора; для імені typedef є першим (або єдиним) оголошенням ідентифікатора». Специфікація C11, 6.7: Declarations, пункт 5. Оголошення найчастіше використовуються для функцій, змінних, констант і класів, але також можуть використовуватися для інших сутностей, таких як переліки та визначення типів. Окрім імені (самого ідентифікатора) та виду сутності (функція, змінна тощо), оголошення зазвичай визначають тип даних (для змінних і констант) або сигнатуру типу (для функцій); типи також можуть містити розмірності, наприклад для масивів. Оголошення використовується для повідомлення компілятору про існування сутності; це важливо в тих строго типізованих мовах, які вимагають, щоб функції, змінні та константи, а також їхні типи були визначені оголошенням до використання, і використовується у попередньому оголошенні. Термін «оголошення» часто протиставляється терміну «визначення», але значення та використання цих термінів суттєво відрізняються залежно від мови.
Оголошення особливо характерні для мов ALGOL-традиції, зокрема сімейства BCPL, найпомітніше C і C++, а також Pascal. Java використовує термін «оголошення», хоча Java не вимагає окремих оголошень і визначень.
Оголошення vs визначення Однією з основних дихотомій є те, чи містить оголошення визначення: наприклад, чи визначає оголошення змінної або константи її значення, чи лише її тип; і аналогічно, чи визначає оголошення функції тіло (імплементація) функції, чи лише її сигнатуру типу. Не всі мови проводять таке розрізнення: у багатьох мовах оголошення завжди містять визначення і можуть називатися або «оголошеннями», або «визначеннями» залежно від мови. Однак ці поняття розрізняються в мовах, які вимагають оголошення перед використанням (для чого використовуються попередні оголошення), а також у мовах, де інтерфейс і реалізація розділені: інтерфейс містить оголошення, а реалізація містить визначення.
У неформальному використанні «оголошення» стосується лише чистого оголошення (лише типи, без значення або тіла), тоді як «визначення» стосується оголошення, яке містить значення або тіло. Однак у формальному використанні (у специфікаціях мов) «оголошення» охоплює обидва ці значення, з детальнішими відмінностями залежно від мови: у C та C++ оголошення функції, яке не містить тіла, називається прототипом функції, тоді як оголошення функції, яке містить тіло, називається «визначенням функції». У Java оголошення існують у двох формах. Для публічних методів вони можуть бути представлені в інтерфейсах як сигнатури методів, які складаються з імен методів, вхідних типів та вихідного типу. Подібний запис може використовуватися у визначеннях абстрактних методів, які не містять визначення. Клас, що містить такий метод, може бути інстанційований; для створення екземпляра класу, який надає визначення методу, необхідно створити новий похідний клас. Починаючи з Java 8, до мови було включено лямбда-вираз, який можна розглядати як оголошення функції.
Оголошення та визначення
У сімействі мов програмування C оголошення часто збираються у заголовкові файли, які включаються в інші файли початкового коду, що посилаються на ці оголошення та використовують їх, але не мають доступу до визначення. Інформація в заголовковому файлі забезпечує інтерфейс між кодом, який використовує оголошення, і кодом, який його визначає, — формою приховування інформації. Оголошення часто використовується для доступу до функцій або змінних, визначених в інших файлах початкового коду або в бібліотеці. Невідповідність між типом визначення та типом оголошення спричиняє помилку компілятора.
Для змінних визначення присвоюють значення області пам'яті, зарезервованій під час етапу оголошення. Для функцій визначення надають тіло функції. Хоча змінна або функція може бути оголошена багато разів, зазвичай вона визначається один раз (у C++ це відоме як правило одного визначення (ODR)).
Динамічні мови, такі як JavaScript або Python, зазвичай дозволяють перевизначати функції, тобто повторно зв'язувати їх; функція є змінною, подібною до будь-якої іншої, з іменем і значенням (визначенням).
Ось деякі приклади оголошень, які не є визначеннями, у C:
extern char example1; extern int example2; void example3(void);
Ось деякі приклади оголошень, які є визначеннями, знову ж таки у C:
char example1; /* Поза визначенням функції вона буде ініціалізована нулем. */ int example2 = 5; void example3(void) { /* визначення між фігурними дужками */ }
Невизначені змінні
У деяких мовах програмування неявне оголошення надається під час першої появи такої змінної під час компіляції. В інших мовах таке використання вважається помилкою, яка може призвести до діагностичного повідомлення. Деякі мови спочатку використовували поведінку з неявним оголошенням, але в міру розвитку надали можливість її вимкнути (наприклад, «use strict» у Perl або «Option Explicit» у Visual Basic).
Див. також Вираз (інформатика) Ініціалізація Область видимості (програмування) Семантика (інформатика)
Примітки
Посилання Declare vs Define in C and C++, Alex Allain 8.2. Declarations, Definitions and Accessibility, The C Book, GBdirect Declarations and Definitions (C++), MSDN "Declarations tell the compiler that a program element or name exists. Definitions specify what code or data the name describes."