One Definition Rule

De la Viquipèdia, l'enciclopèdia lliure
One Definition Rule

Tipusregla Modifica el valor a Wikidata
Característiques tècniques
PlataformaC standard library
Més informació
Stack ExchangeEtiqueta Modifica el valor a Wikidata

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[modifica]

En resum, l'ODR estableix que: [2]

  1. 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.
  2. 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ó.
  3. 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[modifica]

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[modifica]

  1. «Definitions and ODR (One Definition Rule) - cppreference.com» (en anglès). [Consulta: 17 desembre 2023].
  2. «DCL60-CPP. Obey the one-definition rule - SEI CERT C++ Coding Standard - Confluence» (en anglès). [Consulta: 17 desembre 2023].
  3. «C++ | One Definition Rule (ODR)» (en anglès americà). [Consulta: 17 desembre 2023].
  4. «2.7 — Forward declarations and definitions – Learn C++» (en anglès). [Consulta: 17 desembre 2023].