2008-10-03 2 views
64

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

using namespace xyzzy 

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

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

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

unusing namespace xyzzy; 
+2

Вы должны, вероятно, открыть отчет об ошибке с их системой контроля качества: http://qc.codegear.com/ – 2008-10-03 18:23:43

+1

Кстати, какие автогенерированные заголовки это? – 2008-10-17 16:36:41

+0

Однажды C++ будет иметь модули, и в том числе код в другой код будет иметь лучшие конструкции инкапсуляции. До тех пор нет такого легкого пути. Подумайте о том, чтобы разместить свой собственный код в пространстве имен и ссылаться на него таким образом. – 2015-06-30 02:29:38

ответ

45

Неа Но есть потенциальное решение. А если вы заключите директиву включения в пространство имен своих, как это ...

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

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

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

37

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

Пример:

{ 
    using namespace xyzzy; 

} // stop using namespace xyzzy here 

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

+0

Можете ли вы обернуть включение в блок, как это? – Eclipse 2008-10-03 17:43:49

+0

Да, это не будет с автоматически сгенерированным кодом. Byt mybe, он может изменить шаблон для автоматически сгенерированного кода? – 2008-10-03 17:53:41

+0

Да, это не проблема проблемы с заголовками, использующими пространства имен. – Kip 2008-10-03 17:57:24

1

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

12

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

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 
7

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

8

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

-1
#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); 
} 
Смежные вопросы