C++ moderno e alternativas em C

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

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

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

int main(void) {
    printf("%d\n", math_square(7));
}
Resultado da execução
49
C++
Executar →
main.cpp
#include <iostream>

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

int main() {
    std::cout << math::square(7) << '\n';
}
Resultado da execução
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

C usa convenções de nomes, callbacks, macros e structs com contexto.

C++

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.