2017-01-25 11 views
3

Согласитесь, что using namespace XXX не является хорошей практикой. Однако префикс namespaces:: в каждом звонке не только утомительный, но и иногда раздражающий. например, посмотрите на код, ниже которого используется стандартное пространство имен stdИспользование пространства имен :: функция лучше, чем префикс пространства имен :: в каждом вызове?

#include <iostream> 

int main() 
{ 
    std::cout << "Hello World" << std::endl; 
    return 0; 
} 

Однако, я могу избавиться от повторения std::, просто импортируя саму функцию с помощью using ключевого слова, как

#include <iostream> 
using std::cout; 
using std::endl; 
int main() 
{ 
    cout << "Hello World" << endl; 
    return 0; 
} 

Есть ли почему я не должен делать этого, а не префикс std :: во всех операторах. если нет конкретной причины, почему этот подход не продвигается по сравнению с префиксом std::?

Я понимаю из спецификации C++, что using std::func также импортирует перегруженное определение.

+0

http://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-bad-practice – ashiquzzaman33

+0

ИМХО вы можете использовать его в целях тестирования. – ashiquzzaman33

ответ

4

Основная причина использования квалификации пространства имен заключается в том, что она избегает столкновения имен, как локальное имя distance, столкнувшись с std::distance.

Основная причина отказа от квалификации заключается в том, что код затем короче, а некоторым программистам (включая меня) появляется более ясно, потому что он просто читается как английский.

Проблема с коллизиями имен увеличивается с размером кода, и поэтому это один из критериев: чем короче код, тем меньше имеет смысл добавить накладные расходы, чтобы избежать столкновений имен. И наоборот, чем больше база кода и чем дольше это требуется для построения, тем больше причин избежать коллизий имен.

Одно основное правило:

Не когда-либо добавить одеяло using namespace... в глобальном пространстве имен в файле заголовка.

Но, кроме того, это так называемое инженерное решение: идите со своим чувством кишки о преимуществах и затратах и ​​уродстве, читабельности и ясности и т. Д.

0

Используете ли вы

using namespace std; 

или

using namespace std::cout; 
using namespace std::end; 

не имеет большого значения, если он находится в файле .cpp. Любые конфликты имен, возникающие из них, могут быть исправлены локально.

Противодействие их использованию очень сильное, когда дело доходит до файлов заголовков.

я бы не слишком беспокоиться о любом подходе в файле .cpp