Funções estáticas
Parte da seção Programação Orientada a Objetos do Journey de C da Coddy. Lição 4 de 61.
Quando você divide o código em vários arquivos, todas as funções definidas em um arquivo-fonte ficam visíveis para outros arquivos por padrão. Mas, às vezes, você precisa de funções auxiliares que devem ser usadas apenas internamente: funções que outros arquivos não devem acessar nem mesmo conhecer.
A palavra-chave static, quando aplicada a uma função, restringe sua visibilidade ao arquivo em que ela está definida. Isso cria uma função privada que não pode ser chamada de outros arquivos-fonte, mesmo que alguém tente declará-la.
// math_utils.c
#include "math_utils.h"
// Função auxiliar privada - visível apenas neste arquivo
static int square(int x) {
return x * x;
}
// Função pública - pode ser chamada de main.c
int sum_of_squares(int a, int b) {
return square(a) + square(b);
}
Neste exemplo, sum_of_squares é declarada no cabeçalho e pode ser usada em qualquer lugar. No entanto, square é marcada como static, então existe apenas dentro de math_utils.c. Se main.c tentar chamar square() diretamente, o vinculador produzirá um erro: a função simplesmente não existe fora do arquivo.
Essa é a maneira de C alcançar o encapsulamento no nível do arquivo. Funções estáticas permitem ocultar detalhes de implementação, mantendo sua interface pública limpa e usando internamente a lógica auxiliar necessária.
Desafio
FácilVamos criar uma calculadora de distância que usa uma função auxiliar privada para calcular o quadrado de um número: um detalhe que deve permanecer oculto do restante do seu programa.
Você criará três arquivos:
distance.h: seu arquivo de cabeçalho que declara uma única função públicadistance_squared, que recebe quatro inteiros (x1, y1, x2, y2) representando dois pontos e retorna um inteiro. Inclua proteções contra inclusão múltipla usando o símboloDISTANCE_H.distance.c: seu arquivo-fonte que contém a implementação. Crie uma função auxiliarstaticchamadasquare, que recebe um inteiro e retorna seu quadrado. Essa função auxiliar deve estar visível somente emdistance.c. Em seguida, implementedistance_squaredusando sua função auxiliar estática para calcular (x2-x1)² + (y2-y1)².main.c: seu arquivo principal, que inclui o cabeçalho e usa a função pública. A função auxiliarsquarenão deve estar acessível aqui: somentedistance_squaredestá disponível.
A função distance_squared calcula a distância euclidiana ao quadrado entre dois pontos. Ao manter a função square estática, você oculta esse detalhe de implementação de qualquer código fora de distance.c.
Você receberá quatro valores inteiros de entrada: x1, y1, x2 e y2.
Imprima a distância ao quadrado neste formato:
Squared distance: {result}Por exemplo, com os pontos (0, 0) e (3, 4), a saída seria:
Squared distance: 25Experimente você mesmo
#include <stdio.h>
#include "distance.h"
int main() {
int x1, y1, x2, y2;
scanf("%d", &x1);
scanf("%d", &y1);
scanf("%d", &x2);
scanf("%d", &y2);
// TODO: Chame distance_squared com as coordenadas de entrada
// e imprima o resultado no formato: "Squared distance: {result}"
return 0;
}
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Programação Orientada a Objetos
1Fundamentos da Programação Modular
Arquivos de cabeçalhoProteções de inclusãoArquivos-fonteFunções estáticasRevisão: calculadora modular4Encapsulamento
Conceito de ponteiros opacosDefinindo structs opacasGetters e settersValidação em settersRevisão: caixa secreta2Objetos e métodos
Structs como objetosO ponteiro 'Self'Correção de constPonteiro vs. valorMétodos auxiliaresRevisão: Gerenciador de pontos5Projeto: Conta Bancária Simples
Configuração do ProjetoImplementação da Conta3Ciclo de vida do objeto
Padrão de construtorPadrão de destrutorInicialização da pilhaCópia profundaRevisão: wrapper de String6Herança por composição
Incorporação de structRegra do primeiro membroAcessando membros do tipo paiUpcastingRevisão: hierarquia de formas9Projeto: Desenhador de Formas
Visão geral do projetoImplementação do círculoImplementação do retânguloUso polimórficoContêiner de formasPratique por conta própria: Compilador de C online