Вы определенно НЕ должны использовать using namespace
в заголовках именно по той причине, по которой вы говорите, что это может неожиданно изменить значение кода в любых других файлах, которые содержат этот заголовок.Нет способа отменить using namespace
, что является еще одной причиной, по которой он так опасен.Обычно я просто использую grep
или тому подобное, чтобы убедиться, что using namespace
не вызывается в заголовках, а не пробую что-нибудь более сложное.Вероятно, статические средства проверки кода также отмечают это.
Заголовок должен включать только заголовки, необходимые для компиляции.Простой способ обеспечить это - всегда включать собственный заголовок каждого исходного файла в первую очередь, перед любыми другими заголовками.Тогда исходный файл не будет скомпилирован, если заголовок не является автономным.В некоторых случаях, например, ссылаясь на классы деталей реализации в библиотеке, вы можете использовать декларации пересылки вместо #include
, потому что вы полностью контролируете определение такого класса, объявленного форвард.
Я не являюсьКонечно, я бы назвал это распространенным явлением, но оно определенно появляется время от времени, обычно написанное новыми программистами, которые не знают о негативных последствиях.Как правило, небольшое информирование о рисках решает любые проблемы, поскольку их относительно легко исправить.