Правило одного визначення (One Definition Rule, ODR) — важлива концепція в мові програмування , що визначена в ISO C++ Standard(ISO/IEC 14882) 2003, в розділі 3.2.
Коротко ODR стверджує:
- В окремій одиниці трансляції (файлі, якщо конкретна реалізація зберігає тексти програм в файлах, після обробки препроцесором) шаблон, клас, функція, об'єкт, або перерахування можуть мати не більше одного визначення. Хоча деякі можуть мати яку завгодно кількість оголошень.
- В програмі об'єкт або не не можуть мати більш ніж одне визначення. Якщо об'єкт чи непідставна функція не використовуються, тоді достатньо оголошення без визначення. У випадку використання вони повинні мати рівно одне визначення.
- Деякі сутності, наприклад, класи, шаблони або підставні функції можуть мати більше ніж одне визначення тільки якщо:
- вони знаходяться в різних одиницях трансляції;
- вони ідентичні лексема за лексемою;
- значення лексем однаково в обох одиницях трансляції;
Компілятори не завжди знаходять порушення ODR. Багато з них виявляються вже компонувальником.
Приклади
//file 1.c struct S { int a; char b; }; void f(S*); //file 2.c struct S { int a; char b; }; void f(S*) { /* ... */ };
Правило ODR каже, що цей приклад дозволений, і в обох файл під S буде матися на увазі одна і та сама структура. Хоча це й нерозумний спосіб описання структур, через те що людина яка супроводжує file2.c може допустити, що визначення в її файлі єдине і буд вважати себе в праві змінювати його, що може призвести до помилок, які буде важко знайти.
Метою ODR є реалізація можливості включення визначення класу в різні одиниці трансляції із одного заголовного файлу.
//file s.h struct S { int a; char b; }; void f(S*); //file 1.c #include "s.h" // використання f() //file 1.c #include "s.h" void f(S*) { /* ... */ };
Наведемо приклад трьох способів порушення правила ODR:
//file 1.c struct S1 { int a; char b; }; struct S1 { int a; char b; }; // помилка: повторне визначення
Структуру не можна двічі визначити в одному файлі.
//file 1.c struct S2 { int a; char b; }; //file 1.c struct S2 { int a; char bb; }; // помилка
Не ідентичні лексема за лексемою.
//file 1.c typedef int X; struct S3 { X a; char b; }; //file 2.c typedef char X; struct S3 { X a; char b; }; // помилка
Значення лексем різне в різних одиницях трансляції.
Джерела
- by Bjarne Stroustrup — Addison-Wesley Pub Co; 3rd edition (February 15, 2000);
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Pravilo odnogo viznachennya One Definition Rule ODR vazhliva koncepciya v movi programuvannya C sho viznachena v ISO C Standard ISO IEC 14882 2003 v rozdili 3 2 Korotko ODR stverdzhuye V okremij odinici translyaciyi fajli yaksho konkretna realizaciya zberigaye teksti program v fajlah pislya obrobki preprocesorom shablon klas funkciya ob yekt abo pererahuvannya mozhut mati ne bilshe odnogo viznachennya Hocha deyaki mozhut mati yaku zavgodno kilkist ogoloshen V programi ob yekt abo ne ne mozhut mati bilsh nizh odne viznachennya Yaksho ob yekt chi nepidstavna funkciya ne vikoristovuyutsya todi dostatno ogoloshennya bez viznachennya U vipadku vikoristannya voni povinni mati rivno odne viznachennya Deyaki sutnosti napriklad klasi shabloni abo pidstavni funkciyi mozhut mati bilshe nizh odne viznachennya tilki yaksho voni znahodyatsya v riznih odinicyah translyaciyi voni identichni leksema za leksemoyu znachennya leksem odnakovo v oboh odinicyah translyaciyi Kompilyatori ne zavzhdi znahodyat porushennya ODR Bagato z nih viyavlyayutsya vzhe komponuvalnikom Prikladi file 1 c struct S int a char b void f S file 2 c struct S int a char b void f S Pravilo ODR kazhe sho cej priklad dozvolenij i v oboh fajl pid S bude matisya na uvazi odna i ta sama struktura Hocha ce j nerozumnij sposib opisannya struktur cherez te sho lyudina yaka suprovodzhuye file2 c mozhe dopustiti sho viznachennya v yiyi fajli yedine i bud vvazhati sebe v pravi zminyuvati jogo sho mozhe prizvesti do pomilok yaki bude vazhko znajti Metoyu ODR ye realizaciya mozhlivosti vklyuchennya viznachennya klasu v rizni odinici translyaciyi iz odnogo zagolovnogo fajlu file s h struct S int a char b void f S file 1 c include s h vikoristannya f file 1 c include s h void f S Navedemo priklad troh sposobiv porushennya pravila ODR file 1 c struct S1 int a char b struct S1 int a char b pomilka povtorne viznachennya Strukturu ne mozhna dvichi viznachiti v odnomu fajli file 1 c struct S2 int a char b file 1 c struct S2 int a char bb pomilka Ne identichni leksema za leksemoyu file 1 c typedef int X struct S3 X a char b file 2 c typedef char X struct S3 X a char b pomilka Znachennya leksem rizne v riznih odinicyah translyaciyi DzherelaMova programuvannya S by Bjarne Stroustrup Addison Wesley Pub Co 3rd edition February 15 2000 ISBN 0 201 70073 5