Porque eu não uso: 'using namespace std;'

Não uso e não recomendo usar.


Porque eu não uso: 'using namespace std;'

Algumas pessoas gostam sempre de usar e me perguntam porque eu não uso.

Antes de mais nada, utilizar o using namespace std é sim uma boa prática, mas não deve ser usada sempre e para tudo .

Eu evito usar por 2 motivos básicos:

1º. Gosto de saber de qual biblioteca aquela declaração/função faz parte.

Ás vezes você está utilizando uma biblioteca que tem nome de funções iguais. Por exemplo, suponhamos que você tem esse código com esse namespace:

#include <iostream>

using namespace std;
namespace terroo {

  typedef const char * string;

  int abs( const int &num1, const int &num2  ){
    return num1 + num2;
  }

  void print( const string &text ){
    cout << text << '\n';
  }

}

int main(){
  string teste = "Nada";
  terroo::print( teste );
  return 0;
}

Nesse exemplo percebemos uma: string, abs(da cstdlib) e print, além do uso de: using namespace std;, olha que bagunça infeliz!!! 😞

Quando eu tentar compilar terei um belo erro de:

error: invalid initialization of reference of type ‘const char const&’ from expression of type ‘std::string’ {aka ‘std::__cxx11::basic_string<char>’}
  void print( const string &text ){
...

Isso porque o meu tipo string é diferente do tipo string da resolução de escopo std eu usei: using namespace std;. Separar por declaração, acho melhor do que usar no geral, ex.: using std::cout; , mas mesmo assim, fica um pouco bagunçado!

Se removermos o using namespace std; e declarar cada um no seu quadrado, o código compila sem problemas:

#include <iostream>

namespace terroo {

  typedef const char * string;

  int abs( const int &num1, const int &num2  ){
    return num1 + num2;
  }

  void print( const string &text ){
    std::cout << text << '\n';
  }

}

int main(){
  terroo::string teste = "Nada";
  terroo::print( teste );
  return 0;
}

Mas se tiver std::string no lugar de terroo::string você nota que há um melhor trabalho do compilador em lhe ajudar.

Ahh!!! Mas quem vai criar nome de funções, classes, structs, … com nomes que já existem na STL ? Isso é o que mais há.

Nas bibliotecas da Unreal Engine, existe até vector, e não é o vector da std .

Sem dizer o exemplo alí do abs, já vi muita gente usando nomes de funções que já existem na STL e isso pode dar muita dor de cabeça se o cara sempre usar namespace sem resolução de escopo .

2º. Eu não sei de onde veio aquilo

Por exemplo, dia desse tava criando um código com OpenCV e tem um tipo/classe que é VideoCapture e na documentação deles eles utilizam using namespace cv;, demorou, mas descobri que o VideoCapture na verdade é cv::VideoCapture e isso já me aconteceu várias vezes principalmente com a própria std:: .

Por isso eu não gosto de usar e não recomendo, assim como muitos programadores que conheço, mas vale ressaltar que isso é uma questão de gosto, ok?!


Por hoje é só, são pequenas doses diárias que farão sempre nos manter antenado com o C++ !

Acompanhe o cpp::daily

Deseja aprender C++ e criar seus programas Gráficos e para Terminal com portabilidade para Linux e Windows?

Então se inscreva nos nossos Cursos de C++ Moderno . Você aprender criar:

Acesse o endereço:

https://terminalroot.com.br/cpp/ e saiba mais!


cppdaily cpp


Compartilhe


Nosso canal no Youtube

Inscreva-se


Marcos Oliveira

Marcos Oliveira

Desenvolvedor de software
https://github.com/terroo


Crie Aplicativos Gráficos para Linux e Windows com C++

Aprenda C++ Moderno e crie Games, Programas CLI, GUI e TUI de forma fácil.

Saiba Mais

Receba as novidades no seu e-mail!

Após cadastro e confirmação do e-mail, enviaremos semanalmente resumos e também sempre que houver novidades por aqui para que você mantenha-se atualizado!