LOne Definition Rule (ODR) és una regla important del llenguatge de programació C++ que prescriu que les classes/structures i les funcions no en línia no poden tenir més d'una definició a tot el programa i la plantilla i els tipus no poden tenir més d'una definició per unitat de traducció. Es defineix a l'estàndard ISO C++ (ISO/IEC 14882) 2003, a la secció 3.2. Alguns altres llenguatges de programació tenen regles similars però diferents definides per al mateix objectiu.
Resum En resum, l'ODR estableix que:
En qualsevol unitat de traducció, una plantilla, tipus, funció o objecte no pot tenir més d'una definició. Alguns d'aquests poden tenir qualsevol nombre de declaracions. Una definició proporciona una instància. En tot el programa, un objecte o funció no en línia no pot tenir més d'una definició; si s'utilitza un objecte o funció, ha de tenir exactament una definició. Podeu declarar un objecte o funció que no s'utilitza mai, en aquest cas no cal que proporcioneu una definició. En cap cas pot haver-hi més d'una definició. Algunes coses, com ara tipus, plantilles i funcions externes en línia, es poden definir en més d'una unitat de traducció. Per a una entitat determinada, cada definició ha de tenir la mateixa seqüència de fitxes. Els objectes i funcions no externes en diferents unitats de traducció són entitats diferents, encara que els seus noms i tipus siguin els mateixos.
Algunes violacions de l'ODR han de ser diagnosticades pel compilador. Altres infraccions, especialment les que abasten unitats de traducció, no s'han de diagnosticar.
Exemples En general, una unitat de traducció no ha de contenir més d'una definició de qualsevol tipus de classe. En aquest exemple, dues definicions de la classe tipus C apareixen a la mateixa unitat de traducció. Això sol passar si un fitxer de capçalera s'inclou dues vegades al mateix fitxer font sense els protectors de capçalera adequats.class C {}; // first definition of C class C {}; // error, second definition of CA continuació, formar un punter a S o definir una funció prenent una referència a S són exemples de construccions legals, perquè no requereixen que el tipus de S sigui complet. Per tant, no cal una definició.
La definició d'un objecte de tipus S, una funció que pren un argument de tipus S o l'ús de S en una mida d' expressió són exemples de contextos on S ha de ser complet i, per tant, requereixen una definició.struct S; // declaration of S S * p; // ok, no definition required void f(S&); // ok, no definition required void f(S*); // ok, no definition required S f(); // ok, no definition required - this is a function declaration only!
S s; // error, definition required sizeof(S); // error, definition required
Referències
Categoria:Llenguatge de programació C