Namespaces em C++ e prefixos de nome em C
Nesta lição, você vai ver como evitar nomes de função repetidos em programas grandes com namespaces em C++ e com a convenção de prefixos em C.
Introdução
Em programas grandes ou que usam várias bibliotecas, é fácil duas funções acabarem com o mesmo nome. C++ resolve isso com namespaces, que são espaços separados para nomes. C não tem namespaces, então as bibliotecas em C costumam acrescentar um prefixo (prefix) aos nomes, como math_square.
Pontos importantes
- Entenda como se faz em C antes de aprender as abstrações de C++.
- Use RAII e semântica de valor (value semantics) para expressar a posse dos recursos.
- Prefira as ferramentas com segurança de tipos de C++ a macros e conversões de tipo.
Exemplos de código C e C++
#include <stdio.h>
int math_square(int value) {
return value * value;
}
int main(void) {
printf("%d\n", math_square(7));
}
49
#include <iostream>
namespace math {
int square(int value) {
return value * value;
}
}
int main() {
std::cout << math::square(7) << '\n';
}
49
Comparação entre C e C++
Em C, o prefixo math_ é apenas uma convenção de nomes e depende inteiramente do cuidado do programador. Em C++, a função square fica no namespace math e é chamada pelo nome completo, math::square. O compilador garante que nomes em namespaces diferentes não entrem em conflito e permite criar apelidos (aliases) para namespaces de nome longo.
C usa convenções de nomes, callbacks, macros e structs com contexto.
C++ oferece abstrações com escopo claro, seguras quanto a tipos e que normalmente não custam nada a mais na execução.
Exercícios práticos
Execute as duas versões e depois mude o código para observar a diferença de segurança que cada linguagem oferece.
- Escreva primeiro o mecanismo em C e só depois use o recurso equivalente de C++.
- Troque a liberação manual de recursos por RAII.
- Verifique se o recurso causa alocações de memória ou chamadas de funções virtuais.