Одна из капризов моей системы разработки (Codegear C ++ Builder) заключается в том, что некоторые из автоматически сгенерированных заголовков настаивают на том, чтобы ...
using namespace xyzzy
... в них, которые влияют на мой код, когда я меньше всего этого хочу или ожидаю.
Есть ли способ как-то отменить / переопределить предыдущий оператор using, чтобы избежать этого.
Может быть...
unusing namespace xyzzy;
c++
namespaces
c++builder
Родди
источник
источник
Ответы:
Неа. Но есть потенциальное решение: если вы заключите свою директиву include в собственное пространство имен, например ...
namespace codegear { #include "codegear_header.h" } // namespace codegear
... тогда эффекты любых директив using в этом заголовке нейтрализуются.
В некоторых случаях это может быть проблематично. Вот почему каждое руководство по стилю C ++ настоятельно рекомендует не помещать директиву «using namespace» в файл заголовка.
источник
Нет , вы не можете не использование пространства имен. Единственное, что вы можете сделать, - это поставить
using namespace
-statement блок, чтобы ограничить его область действия.Пример:
{ using namespace xyzzy; } // stop using namespace xyzzy here
Возможно, вы можете изменить шаблон, который используется для ваших автоматически сгенерированных заголовков.
источник
Вы можете застрять в использовании явных пространств имен для конфликтов:
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
источник
Для справки в будущем: начиная с версии XE есть новое значение, которое вы можете #define, чтобы избежать страшного
using namespace System;
int, include: DELPHIHEADER_NO_IMPLICIT_NAMESPACE_USEисточник
Как насчет использования sed, perl или другого инструмента командной строки как части процесса сборки для изменения сгенерированных заголовков после их создания, но до их использования?
источник
Быстрый эксперимент с Visual Studio 2005 показывает, что вы можете заключить эти заголовки в свое собственное именованное пространство имен, а затем
use
то, что вам нужно, из этого пространства имен (но неuse
все пространство имен, поскольку оно вводит пространство имен, которое вы хотите скрыть.источник
#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); }
источник