Как я могу "отключить" пространство имен?

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

using namespace xyzzy

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

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

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

unusing namespace xyzzy;

Ответ 1

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

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

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

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

Ответ 2

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

Пример:

{
    using namespace xyzzy;

} // stop using namespace xyzzy here

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

Ответ 7

#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);
}