Как я могу «не использовать» пространство имен?
-
03-07-2019 - |
Вопрос
Одна из особенностей моей системы разработки (Codegear C++Builder) заключается в том, что некоторые автоматически генерируемые заголовки требуют наличия...
using namespace xyzzy
... утверждения в них, которые влияют на мой код, когда я меньше всего этого хочу или ожидаю.
Есть ли способ каким-то образом отменить/переопределить предыдущий оператор «использования», чтобы избежать этого.
Может быть...
unusing namespace xyzzy;
Решение
Неа.Но есть потенциальное решение:если вы поместите директиву include в собственное пространство имен, вот так...
namespace codegear {
#include "codegear_header.h"
} // namespace codegear
... тогда эффекты любых директив использования в этом заголовке нейтрализуются.
В некоторых случаях это может быть проблематично.Вот почему каждое руководство по стилю 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;
внутри включить: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);
}