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, toda função definida em um arquivo-fonte fica visível para os 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 foi 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"
// Auxiliar privado - visível apenas neste arquivo
static int square(int x) {
return x * x;
}
// Função pública - pode ser chamada a partir de main.c
int sum_of_squares(int a, int b) {
return square(a) + square(b);
}
Neste exemplo, sum_of_squares é declarado no cabeçalho e pode ser usado em qualquer lugar. No entanto, square é marcado como static, portanto existe apenas em 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 enquanto você usa internamente a lógica auxiliar de que precisar.
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_squaredque recebe quatro inteiros (x1, y1, x2, y2) representando dois pontos e retorna um inteiro. Inclua guardas usando o símboloDISTANCE_H.distance.c: seu arquivo-fonte contendo a implementação. Crie uma função auxiliarstaticchamadasquareque recebe um inteiro e retorna seu quadrado. Essa função auxiliar deve ser visível apenas dentro dedistance.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 como estática, você oculta esse detalhe de implementação de qualquer código fora de distance.c.
Você receberá quatro entradas inteiras: 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
// and print the result in the format: "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çalhoInclude GuardsArquivos-FonteFunções EstáticasRecapitulação: Calculadora Modular4Encapsulamento
Conceito de Ponteiros OpacosDefinindo Structs OpacasGetters e SettersValidação em SettersRecapitulação: Caixa Secreta2Objetos e Métodos
Structs como ObjetosO Ponteiro 'Self'Const CorrectnessPonteiro vs ValorMétodos AuxiliaresRecapitulação: Point Manager5Projeto: Conta Bancária Simples
Configuração do ProjetoImplementação da Conta3Ciclo de Vida de Objetos
Padrão de ConstrutorPadrão de DestrutorInicialização na StackCópia ProfundaRecapitulação: String Wrapper6Herança via Composição
Incorporação de StructsA Regra do Primeiro MembroAcessando Membros PaiUpcastingRecapitulação: Hierarquia de Formas9Projeto: Desenhador de Formas
Visão Geral do ProjetoImplementação do CírculoImplementação do RetânguloUso PolimórficoContainer de FormasPratique por conta própria: Compilador de C online