Использование C++ для std и boost передового опыта
Возможный дубликат:
Вы предпочитаете явные пространства имен или "использование" в C++?
Привет, ребята, я разработчик на C#, но мой друг на C++, и он показал мне код, который заполнен вызовами вроде std::for_each и boost::bind, я привык использовать в C#, и подумал, что использование директив будет качаться для удобочитаемости кода и, как правило, более быстрой разработки, было бы затруднительно набирать любое пространство имен, например, перед оператором C# foreach.
Какие плюсы и минусы использования для таких популярных пространств имен мне интересно? Лучше ли включать эти пространства имен или нет?
2 ответа
Прежде всего, давайте сделаем два различия:
1) Есть такие директивы, как using namespace std;
и используя объявления как using std::cout;
2) Вы можете поместить директивы и объявления в заголовок (.h) или в файл реализации (.cpp).
Кроме того, использование директив и объявлений приводит имена в пространство имен, в котором они написаны, т.е.
namespace blah
{
using namespace std; // doesn't pollute the *global* namespace, only blah
}
Теперь, с точки зрения наилучшей практики, ясно, что размещение директив и объявлений в заголовочном файле в глобальном пространстве имен - это ужасно нет-нет. Люди будут ненавидеть вас за это, потому что любой файл, содержащий этот заголовок, будет иметь загрязненное глобальное пространство имен.
Размещение директив и объявлений в файлах реализации несколько более приемлемо, хотя это может сделать или не сделать код менее понятным. В целом, вы должны предпочесть использование объявлений использованию директив в таких случаях. Я предпочитаю всегда указывать пространство имен, если только оно не слишком раздражающее (тогда я могу испытать искушение).
В заголовке, если ввод пространства имен каждый раз становится действительно утомительным, вы всегда можете ввести "локальное" пространство имен, например
namespace MyLocalName
{
using namespace boost;
class X
{
// can use things from boost:: here without qualification
};
}
using MyLocalName::X; // brings X back into the global namespace
Но никогда не ставлю using namespace boost;
или эквивалент где-нибудь, где он будет перетаскивать весь материал из Boost в собственное глобальное пространство имен для других людей.
Я против using namespace
операторы, за исключением, может быть, локально в теле функции. Нетрудно писать полное пространство имен перед каждым идентификатором, за исключением случаев, когда вы пишете как 500 loc в день.