Domanda

Uno dei capricci del mio sistema di sviluppo (Codegear C ++ Builder) è che alcune delle intestazioni generate automaticamente insistono per avere ...

using namespace xyzzy

... dichiarazioni in essi contenute, che incidono sul mio codice quando meno lo desidero o me lo aspetto.

C'è un modo in cui posso in qualche modo annullare / sovrascrivere un precedente "quot" usando " dichiarazione per evitarlo.

Forse ...

unusing namespace xyzzy;
È stato utile?

Soluzione

No. Ma c'è una potenziale soluzione: se racchiudi la direttiva include in uno spazio dei nomi a sé stante, come questo ...

namespace codegear {
    #include "codegear_header.h"
} // namespace codegear

... quindi gli effetti di qualsiasi uso delle direttive all'interno di quell'intestazione vengono neutralizzati.

Ciò potrebbe essere problematico in alcuni casi. Ecco perché ogni guida di stile C ++ raccomanda vivamente non di inserire un " usando lo spazio dei nomi " direttiva in un file di intestazione.

Altri suggerimenti

No, non puoi non usare uno spazio dei nomi. L'unica cosa che puoi fare è mettere un usando namespace -statement un blocco per limitarne l'ambito.

Esempio:

{
    using namespace xyzzy;

} // stop using namespace xyzzy here

Forse puoi cambiare il modello utilizzato per le intestazioni generate automaticamente.

Potresti rimanere bloccato usando spazi dei nomi espliciti sui conflitti:

string x; // Doesn't work due to conflicting declarations
::string y; // use the class from the global namespace
std::string z; // use the string class from the std namespace

Per riferimento futuro: dalla versione XE c'è un nuovo valore che puoi #definire per evitare il temuto usando il sistema dello spazio dei nomi; int include: DELPHIHEADER_NO_IMPLICIT_NAMESPACE_USE

Che ne dici di usare sed, perl o qualche altro strumento da riga di comando come parte del tuo processo di compilazione per modificare le intestazioni generate dopo che sono state generate ma prima che vengano usate?

L'esperimento rapido con Visual Studio 2005 mostra che è possibile racchiudere quelle intestazioni nel proprio spazio dei nomi con nome e quindi utilizzare ciò che è necessario da questo spazio dei nomi (ma non utilizzare l'intero spazio dei nomi, in quanto introduce lo spazio dei nomi che si desidera nascondere.

#include<iostream>
#include<stdio.h>
namespace namespace1 {
    int t = 10;
}
namespace namespace2 {
    int t = 20;
}
int main() {
using namespace namespace1;
    printf("%d" , t);
    printf("%d" , namespace2::t);
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top