Как я могу "не использовать" пространство имен? - PullRequest
76 голосов
/ 03 октября 2008

Одним из капризов моей системы разработки (Codegear C ++ Builder) является то, что некоторые из автоматически сгенерированных заголовков требуют наличия ...

using namespace xyzzy

... операторы в них, которые влияют на мой код, когда я меньше всего этого хочу или ожидаю.

Есть ли способ, которым я могу как-то отменить / переопределить предыдущее выражение "using", чтобы избежать этого.

Может быть ...

unusing namespace xyzzy;

Ответы [ 7 ]

55 голосов
/ 03 октября 2008

Неа. Но есть потенциальное решение: если вы включите директиву include в собственное пространство имен, например так ...

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

... тогда эффекты любых директив использования в этом заголовке нейтрализуются.

Это может быть проблематично в некоторых случаях. Вот почему каждое руководство по стилю C ++ настоятельно рекомендует , а не помещать в заголовочный файл директиву using namespace.

45 голосов
/ 03 октября 2008

Нет, вы не можете использовать пространство имен. Единственное, что вы можете сделать, это поместить using namespace -состояние в блок, чтобы ограничить его область действия.

Пример:

{
    using namespace xyzzy;

} // stop using namespace xyzzy here

Может быть, вы можете изменить шаблон, который используется для ваших автоматически сгенерированных заголовков.

15 голосов
/ 03 октября 2008

Вы можете застрять, используя явные пространства имен при конфликтах:

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
10 голосов
/ 11 января 2011

Для дальнейшего использования: начиная с версии XE, есть новое значение, которое вы можете #define, чтобы избежать страшных using namespace System; int, включая: DELPHIHEADER_NO_IMPLICIT_NAMESPACE_USE

7 голосов
/ 03 октября 2008

Как насчет использования sed, perl или какого-либо другого инструмента командной строки как части вашего процесса сборки для изменения сгенерированных заголовков после их создания, но до их использования?

1 голос
/ 03 октября 2008

Быстрый эксперимент с Visual Studio 2005 показывает, что вы можете заключить эти заголовки в собственное именованное пространство имен, а затем use, что вам нужно из этого пространства имен (но не use всего пространства имен, так как оно вводит пространство имен ты хочешь спрятаться.

0 голосов
/ 26 апреля 2017
#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);
}
...