namespace e guardie con conflitti di denominazione

3

C ++ ha namespace per evitare collisioni di cose con lo stesso nome.

Le guardie di testa hanno uno scopo diverso. Impediscono a include di utilizzare la stessa intestazione due volte. Tuttavia, possono soffrire dello stesso problema: cosa succede se due guardie di intestazione di file diversi usano lo stesso nome popolare? Cosa succede se ci sono due librerie che hanno una classe LinkedList :

#ifndef LinkedList_H
#define LinkedList_H

// stuff

#endif

Perché questi due mezzi identificano univocamente un codice così diverso? È come una caratteristica linguistica sofisticata su un lato e un aggeggio macro con una stringa arbitraria sull'altro. Perché i conflitti di denominazione non rappresentano un problema per le guardie di intestazione? Non dovrebbe lo spazio dei nomi far parte della guardia di intestazione, per renderlo unico come lo spazio dei nomi, in modo che non solo prevenga il duplicato% diinclude ma anche i conflitti di denominazione?

    
posta null 13.09.2016 - 23:08
fonte

3 risposte

2

Un metodo che uso è quello di creare un nome di macro più complesso che abbia praticamente zero possibilità di scontrarsi con altri nomi. Questo potrebbe essere creato dai seguenti componenti:

  • Nome progetto
  • Nome spazio dei nomi
  • Nome file
  • Numero casuale o GUID

Esempio:

#if !defined MYPROJECT_MYNAMESPACE_FOO_HPP_9E72F091C4A833D7
#define ...

Overkill? Sì. Facile da fare? Sì. Ha una possibilità così infinitamente piccola di collisione che posso scrivere e dimenticarmene? Sì.

    
risposta data 13.09.2016 - 23:47
fonte
3

Le protezioni dell'intestazione non sono sofisticate come gli spazi dei nomi perché fanno parte del preprocessore (come le intestazioni stesse) e il preprocessore è una parte estremamente primitiva del C ++, ereditata da C.

Una convenzione comune è quella di aggiungere un progetto e un percorso nel progetto come prefisso, ad es.

#ifndef MYPROJECT_UTILITY_CONTAINERS_LINKED_LIST_HPP
#define MYPROJECT_UTILITY_CONTAINERS_LINKED_LIST_HPP

Ovviamente non è l'unico.

    
risposta data 13.09.2016 - 23:16
fonte
3
#pragma once

In realtà, è supportato da tutti i principali compiler (preprocessori). Alcuni progetti si muovono per usarlo: Qt Creator per esempio. Sì, è non standard.

    
risposta data 14.09.2016 - 04:54
fonte

Leggi altre domande sui tag