C++ moderno y alternativas en C

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++

C
Ejecutar →
main.c
#include <stdio.h>

int math_square(int value) {
    return value * value;
}

int main(void) {
    printf("%d\n", math_square(7));
}
Resultado de la ejecución
49
C++
Ejecutar →
main.cpp
#include <iostream>

namespace math {
    int square(int value) {
        return value * value;
    }
}

int main() {
    std::cout << math::square(7) << '\n';
}
Resultado de la ejecució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

C usa convenciones de nombres, callbacks, macros y struct de contexto.

C++

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.