One Definition Rule
Tipus | regla ![]() |
---|---|
Característiques tècniques | |
Plataforma | C standard library |
Més informació | |
Stack Exchange | Etiqueta ![]() |
| |
L'One 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.[1]
Resum
En resum, l'ODR estableix que: [2]
- 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.[3]
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.[4]
class C {}; // first definition of C class C {}; // error, second definition of C
A 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
- ↑ «Definitions and ODR (One Definition Rule) - cppreference.com» (en anglès). [Consulta: 17 desembre 2023].
- ↑ «DCL60-CPP. Obey the one-definition rule - SEI CERT C++ Coding Standard - Confluence» (en anglès). [Consulta: 17 desembre 2023].
- ↑ «C++ | One Definition Rule (ODR)» (en anglès americà). [Consulta: 17 desembre 2023].
- ↑ «2.7 — Forward declarations and definitions – Learn C++» (en anglès). [Consulta: 17 desembre 2023].