Ci scusiamo per questa domanda stupida, ma esiste un modo per limitare le direttive using
al file corrente in modo che non si propaghino ai file che questo file è #include
?Restringere le direttive `using` al file corrente
risposta
Forse il wrapping del codice da includere nel proprio spazio dei nomi potrebbe ottenere il comportamento
desiderato, poiché gli spazi dei nomi hanno effetto sull'ambito.
// FILENAME is the file to be included
namespace FILENAME_NS {
using namespace std;
namespace INNER_NS {
[wrapped code]
}
}
using namespace FILENAME_NS::INNER_NS;
e in qualche altro file
#include <FILENAME>
// std namespace is not visible, only INNER_NS definitions and declarations
...
Ehi, bel trucco! Penso che andrò per questo; Molte grazie! :) – missingfaktor
No, non c'è, motivo per cui non si dovrebbe usare le direttive nei file di intestazione, o qualsiasi altro file che si include.
Per estenderlo un po '- il preprocessore (che gestisce i comandi '# include' e altri' # '-commands) viene eseguito prima che il compilatore veda il codice. La direttiva 'using' e qualsiasi altra parola chiave standard sono elaborate dal compilatore. Quindi, per quanto riguarda il compilatore, i file header non sono in realtà file separati - sono il codice che si trova in ogni file in cui sono '# include''d, e quindi lo è anche l'uso di' using'. direttive che potresti inserire. – Amber
Aah ... triste. Grazie comunque per la risposta. – missingfaktor
@Rahul Non è così male - puoi (e dovresti) ovviamente usare le direttive 'using' nei tuoi file .cpp. –
Tecnicamente si dovrebbe essere in grado di importarli in un certo spazio dei nomi interno, e poi fare le cose dichiarate in quella visibile nello spazio dei nomi significato per l'utente.
#ifndef HEADER_HPP
#define HEADER_HPP
#include <string>
namespace my_detail
{
using std::string;
inline string concatenate(const string& a, const string& b) { return a + b; }
}
namespace my_namespace
{
using my_detail::concatenate;
}
#endif
#include <iostream>
#include "header.hpp"
using namespace my_namespace;
int main()
{
std:: //required
string a("Hello "), b("world!");
std::cout << concatenate(a, b) << '\n';
}
Non so se vale la pena e come ben si gioca con "lookup argomento-dipendente".
Troppi problemi davvero. Ma ancora un bel lavoro in giro. Quindi, +1. :) – missingfaktor
- 1. Direttive globali "using" in VS2010/C#?
- 2. Aggiungi "using" al file ASPX o ASCX
- 3. Predefinito utilizzando le direttive nei nuovi file C#
- 4. Confronto tra le modifiche apportate al file corrente tramite Git
- 5. Restringere i tipi di file in JQuery File upload demo
- 6. Come creare direttive AngularJs riutilizzabili che copiano le direttive esistenti
- 7. Le direttive AngularJS non funzionano
- 8. C# a livello di progetto utilizzando le direttive alias
- 9. C: Le direttive #define sono globali?
- 10. Come risolvere automaticamente la mancanza di Intellisense Usando le direttive
- 11. Namespace e l'uso di direttive
- 12. Come implementare le direttive include usando boost :: spirit :: lex?
- 13. Come comunicano le direttive da un controller?
- 14. aggiungendo dinamicamente le direttive in ng-repeat
- 15. Comunicazione con le direttive di pari livello
- 16. Come si documentano le direttive AngularJS?
- 17. Come rientrare le direttive #if nel codice?
- 18. Come faccio a testare le direttive del compilatore con una condizione MSBuild in un file .csproj?
- 19. Direttive di annidamento all'interno delle direttive
- 20. Utilizzo di direttive ordinate in ordine errato
- 21. boost :: percorso relativo al file system e directory corrente?
- 22. crea un percorso file "sempre relativo al modulo corrente"?
- 23. android: using ActivityGroup per incorporare le attività
- 24. Ruota immagine senza restringere su Android
- 25. std :: queue dovrei restringere per adattarsi?
- 26. direttive angular.js in diversi moduli
- 27. tramite espressioni direttive
- 28. Le sottoclassi di Perl ereditano moduli e direttive importati?
- 29. Le indentazioni delle direttive preprocessore sono sensibili in F #?
- 30. dinamicamente aggiungendo direttive angolari
È possibile limitare l'utilizzo delle direttive a un ambito non di file, ad esempio uno spazio dei nomi o una funzione. –
È molto meglio non applicare la direttiva 'using' nelle intestazioni. –
@David: Odio scrivere qualcosa come 'std :: map>' quando riesco a digitare 'map >' . –
missingfaktor