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:
Á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 deterroo::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 .
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++ !
Então se inscreva nos nossos Cursos de C++ Moderno . Você aprender criar:
Acesse o endereço: