Organizar e depurar programas
Cabeçalhos, definições, ligação, CMake, CLion e um procedimento de depuração.
Onde está a definição?
O cabeçalho declara a função. O ficheiro .cpp define-a. A ligação junta
os objetos.
// dobro.hpp, com guarda:
double dobro(double valor);
// dobro.cpp:
#include "dobro.hpp"
double dobro(double valor) { return 2.0 * valor; }
- Cada
.cppcom includes é uma unidade. Compila sozinho, liga junto. - Sem
dobro.cpp, a ligação falha comundefined reference. dobro(int)em vez dedobro(double)cria outra sobrecarga. A esperada continua em falta.- Não incluas
.cpp. Acrescenta ao alvo.
Como compilo?
g++ -std=c++17 -Wall -Wextra -Wpedantic main.cpp dobro.cpp -o exemplo
./exemplo
add_executable(exemplo main.cpp dobro.cpp)
target_compile_features(exemplo PRIVATE cxx_std_17)
cmake -S . -B build configura. cmake --build build compila. Não edites build.
Que fase falhou?
| Sintoma | Fase | Verifica primeiro |
|---|---|---|
| Nome desconhecido | Compilação | Include, declaração, assinatura |
| Referência por definir | Ligação | .cpp no alvo, definição igual |
| Símbolo repetido | Ligação | Definições em cabeçalhos |
| Valor errado | Execução | Contrato, entrada, estado |
| Falha de memória | Execução | Limites, vida, dono |
Depurar:
- Reduz a entrada com resultado conhecido.
- Compila Debug, para antes da divergência.
- Compara estado com o contrato.
- Corrige, repete, acrescenta teste. Só depois alarga fronteiras.
Com {-1, -2}, erase devolve iterador para -2. Avançar outra vez salta-o por engano.