Los espacios de nombres en C++ y los prefijos de nombres en C
En esta lección vas a ver cómo evitar nombres de funciones repetidos en un programa grande, con los espacios de nombres (namespace) de C++ y la convención de prefijos en C.
Introducción
En un programa grande, o cuando se usan muchas bibliotecas, es fácil que dos funciones tengan el mismo nombre. C++ resuelve este problema con los espacios de nombres (namespace), zonas separadas para los nombres. C no tiene espacios de nombres, así que las bibliotecas de C suelen añadir un prefijo (prefix) a los nombres, como math_square.
Puntos importantes
- Entiende cómo se hace en C antes de aprender las abstracciones de C++.
- Expresa la propiedad de los recursos con RAII y la semántica de valor (value semantics).
- Usa las herramientas de C++ con seguridad de tipos en lugar de macros y conversiones de tipo.
Ejemplos de código C y 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
Comparación entre C y C++
En C, el prefijo math_ es solo una convención de nombres que depende por completo de la disciplina del programador. En C++, la función square está dentro del espacio de nombres math y se llama con su nombre completo, math::square. El compilador garantiza que los nombres de espacios de nombres distintos no choquen entre sí, y permite dar un alias a los espacios de nombres con nombres demasiado largos.
C usa convenciones de nombres, callbacks, macros y struct de contexto.
C++ ofrece abstracciones con un alcance bien delimitado, con seguridad de tipos y normalmente sin coste adicional al ejecutar.
Ejercicios de práctica
Ejecuta las dos versiones y después modifica el código para ver la diferencia de seguridad que aporta cada lenguaje.
- Escribe primero el mecanismo en C y después usa la función equivalente de C++.
- Sustituye la liberación manual de recursos por RAII.
- Comprueba si la función provoca reservas de memoria o llamadas a funciones virtuales.