Как я могу «не использовать» пространство имен?

StackOverflow https://stackoverflow.com/questions/167862

  •  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);
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top