2010-08-28 3 views

ответ

33

Вы можете объединить пространство имен в один имя и использовать новое имя (то есть Foobar).

namespace Foo { namespace Bar { 
    void some_func() { 
     printf("Hello World."); 
    } 
}} 

namespace Foobar = Foo::Bar; 

int main() 
{ 
    Foobar::some_func(); 
} 
+8

+1 для информации, которую он не мог получить, просто спросив своего компилятора. –

+1

еще одна ненужная, запутанная функциональность. –

1

Вы попробовали? Visual C++ дает мне следующие ошибки:

1> C: \ ... \ foo.cpp (31): ошибка C2061: синтаксическая ошибка: идентификатор 'бар'
1> C: \ ... \ fooo.cpp (31): ошибка C2143: синтаксическая ошибка: отсутствует ';' до '{'

+4

Примечание. Просто потому, что что-то работает или не работает с конкретным компилятором, это не значит, что это стандарты или не соответствуют стандартам. –

+1

@Billy: Что-то работающее ничего не значит. Что-то * не * работает. Если ваш компилятор не поддерживает функцию, то вы не можете ее использовать, независимо от того, что стандарт говорит по этому вопросу. –

+1

@ Dennis: В то время как это правда, ОП не спрашивал, поддержит ли его или ее компилятор, (ы) он спросил, действительно ли это. –

11

Нет, это не так. Вместо связки отступом вложенных пространств имен, это, конечно, действует, чтобы положить их на той же строке:

namespace Foo { namespace Bar { namespace YetAnother { 
    // do something fancy 
} } } // end Foo::Bar::YetAnother namespace 

Update:

You can now nest namespaces more cleanly in C++17:

namespace Foo::Bar::YetAnother { 
    // do something even fancier! 
} 
5

Квалифицированные имена, как something::someting_else в C++ можно использовать только для обозначения лиц, которые уже были объявлены ранее. Вы не можете использовать такие имена, чтобы ввести что-то ранее неизвестное. Даже если вложенное пространство имен уже было объявлено ранее, расширение этого пространства имен также рассматривается как «введение чего-то нового», поэтому квалифицированное имя не допускается.

Вы можете использовать такие имена для определения функций, ранее объявленных в пространстве имен

namespace foo { 
    namespace bar { 
    int baz(); 
    } 
} 

// Define 
int foo::bar::baz() { 
    /* ... */ 
} 

но не объявляя новые пространства имен, расширение существующих.

0

Согласно грамматике в $ 2,10, идентификатор не может иметь токен ":". Таким образом, имя foo::bar плохо сформировано.

+0

Это не означает многого, не указывая также, что здесь нужен идентификатор. 'foo :: bar', очевидно, действителен. –

Смежные вопросы