Sobes.tech
Middle

Em que situações é necessário escrever código em ficheiros de cabeçalho?

sobes.tech IA

Resposta da IA

Casos em que o código é escrito em ficheiros de cabeçalho:

  1. Funções e classes template (Template Functions and Classes): O compilador precisa de conhecer todo o código do template para a sua especialização ao usar.

    template <typename T>
    T max(T a, T b) {
        return (a > b) ? a : b;
    }
    
  2. Funções inline: O compilador pode substituir a chamada à função pelo seu corpo, o que requer que o código da função esteja no local da sua utilização. A palavra-chave inline é apenas uma recomendação ao compilador.

    inline int add(int a, int b) {
        return a + b;
    }
    
  3. Variáveis constantes com ligação interna (static const / constexpr): Estas variáveis geralmente são definidas e inicializadas diretamente no ficheiro de cabeçalho.

    static const int MAX_SIZE = 100;
    constexpr double PI = 3.14159;
    
  4. Declarações e definições de membros estáticos constantes (static const member variables): Para tipos inteiros, podem ser inicializadas diretamente na declaração dentro da classe.

    class MyClass {
    public:
        static const int DEFAULT_VALUE = 42;
    };
    
  5. Alguns tipos de macros: Embora o uso de macros deva ser minimizado em favor de constexpr, podem ser definidas em ficheiros de cabeçalho para propagação no projeto.

    #define BUFFER_SIZE 1024
    
  6. Funções acessórias pequenas ou getters/setters: Às vezes, para melhorar o desempenho ou conveniência, funções pequenas podem ser definidas no ficheiro de cabeçalho, frequentemente com inline implícito ou explícito.

    class Point {
    private:
        int x_, y_;
    public:
        int getX() const { return x_; }
        void setX(int x) { x_ = x; }
    };
    

A duplicação de definições de funções ou variáveis com ligação externa em ficheiros de cabeçalho leva a erros de ligação (violação da regra de uma única definição), exceto nos casos acima mencionados.