Používá pro anonymní jmenné prostory v hlavičkové soubory

hlasů
35

Někdo tvrdil, na tak dnes, že byste nikdy neměli používat anonymní jmenné prostory v hlavičkových souborech. Za normálních okolností je to správné, ale Vzpomínám si jednou mi někdo řekl, že jeden ze standardních knihoven používá anonymní jmenných prostorů v hlavičkových souborů provést nějakou inicializaci.

Jsem si vzpomněl správně? Může někdo vyplnit v detailech?

Položena 10/12/2008 v 21:49
zdroj uživatelem
V jiných jazycích...                            


5 odpovědí

hlasů
2

Opravdu nevidím pozitivní přínos z používání anonymních jmenných prostorů v záhlaví. Zmatek, který může vyplývat z mající stejné prohlášení symbol znamená v podstatě jiná věc při sestavování jednotek, které obsahují tuto hlavičku by být zaručen způsob, jak jít předčasně a bolestivě plešatý.

Odpovězeno 10/12/2008 v 22:25
zdroj uživatelem

hlasů
0

Pokud je to inicializace, bylo by pravděpodobné, že být iostreams header (podobně istream, iosatd.)

Odpovězeno 10/12/2008 v 22:29
zdroj uživatelem

hlasů
13

Nevidím žádný smysl v uvedení anonymní názvů do souboru záhlaví. Jsem grepped standardní a libstdc ++ záhlaví, nebyl nalezen anonymní jmenné prostory od sebe jeden v tuplezáhlaví (C ++ 1x rozšiřujícího):

  // A class (and instance) which can be used in 'tie' when an element
  // of a tuple is not required
  struct _Swallow_assign
  {
    template<class _Tp>
      _Swallow_assign&
      operator=(const _Tp&)
      { return *this; }
  };

  // TODO: Put this in some kind of shared file.
  namespace
  {
    _Swallow_assign ignore;
  }; // anonymous namespace

To je, takže si můžete udělat

std::tie(a, std::ignore, b) = some_tuple;

prvky some_tuple jsou přiřazeny proměnné na levé straně (viz zde ), což je podobná technika se používá pro tento iterátor. Druhý prvek je ignorován.

Ale jak se říká, že je třeba dát do souboru cpp a jedna instance by měla být sdílena všemi uživateli. Oni by dal prohlášení o tom do hlavičky, jako je tento, pak:

extern _Swallow_assign ignore;
Odpovězeno 10/12/2008 v 22:38
zdroj uživatelem

hlasů
20

Jediná situace, kdy bezejmenná jmenný prostor v záhlaví může být užitečné je, když chcete distribuovat kód jako hlavička pouze soubory. Například, velký samostatný podmnožina Boost, je čistě hlavičky.

Token ignorepro n-tic, je uvedeno v jiné odpovědi, je jedním z příkladů, že _1, _2atd váží zástupné jsou jiní.

Odpovězeno 11/12/2008 v 10:46
zdroj uživatelem

hlasů
4

Viděl jsem ho použít k vytvoření výchozí hodnotu pro proměnné v různých překladových jednotek. Ale mohlo by to způsobit neočekávané chování v případě názvů soubojů.

Příklad

a.hpp

namespace
{
    const char name[] = "default";
}
// This macro will hide the anonymous variable "name"
#define SET_NAME(newname) \
static const char name[] = newname;

b.cpp

#include "a.hpp"
SET_NAME("file b") // name is "file b" in this translation unit

c.cpp

#include "a.hpp"
SET_NAME("file c") // name is "file c" in this translation unit

d.cpp

#include "a.hpp"
// name is "default" in this translation unit

e.cpp

#include "a.hpp"
static const char name[] = "unintended";
// accidently hiding anonymous name
Odpovězeno 08/09/2015 v 08:21
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more