Funções Estáticas
Parte da seção Object Oriented Programming do Journey de C da Coddy — lição 4 de 61.
Quando você divide o código em vários arquivos, cada função definida em um arquivo de origem é visível 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 ou sequer conhecer.
A palavra-chave static, quando aplicada a uma função, restringe sua visibilidade ao arquivo onde ela é definida. Isso cria uma função privada que não pode ser chamada de outros arquivos de origem, 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 é declarada no cabeçalho e pode ser usada em qualquer lugar. No entanto, square está marcada como static, portanto, ela existe apenas dentro de math_utils.c. Se main.c tentar chamar square() diretamente, o linker produzirá um erro — a função simplesmente não existe fora de seu arquivo.
Esta é a maneira do C de alcançar o encapsulamento no nível do arquivo. Funções estáticas permitem que você esconda detalhes de implementação, mantendo sua interface pública limpa enquanto utiliza qualquer lógica auxiliar necessária internamente.
Desafio
FácilVamos construir uma calculadora de distância que utiliza 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 declarando uma única função públicadistance_squaredque recebe quatro inteiros (x1, y1, x2, y2) representando dois pontos e retorna um inteiro. Inclua guards usando o símboloDISTANCE_H.distance.c: Seu arquivo de origem contendo a implementação. Crie uma função auxiliarstaticchamadasquareque recebe um inteiro e retorna o seu quadrado. Esta auxiliar deve ser visível apenas dentro dedistance.c. Em seguida, implementedistance_squaredusando sua auxiliar estática para calcular (x2-x1)² + (y2-y1)².main.c: Seu arquivo principal que inclui o cabeçalho e utiliza a função pública. A auxiliarsquarenão deve estar acessível aqui — apenasdistance_squaredestá disponível.
A função distance_squared calcula o quadrado da distância euclidiana entre dois pontos. Ao manter a função square como estática, você está ocultando 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: 25Folha de consulta
A palavra-chave static restringe a visibilidade de uma função ao arquivo onde ela é definida, criando uma função privada que não pode ser chamada a partir de outros arquivos de origem.
// 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 outros arquivos
int sum_of_squares(int a, int b) {
return square(a) + square(b);
}
Funções estáticas fornecem encapsulamento em nível de arquivo, permitindo que você oculte detalhes de implementação enquanto mantém sua interface pública limpa.
Experimente 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 Object Oriented Programming
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írculo