C estruturado e ferramentas

Tipos, conversões, módulos, compilação separada e bibliotecas estáticas em C.

TLDR

Perguntar sobre esta página

ChatGPTClaudePerplexityGrokGeminiCopiar e abrirDeepSeekCopiar e abrir

Tipos e conversões

  • C passa argumentos por valor. Uma struct recebida por valor é uma cópia; um apontador permite alterar o objeto apontado.
  • <stdint.h> fornece larguras fixas, como uint8_t e uint32_t. size_t representa tamanhos de objetos. O tamanho de int depende da implementação.
  • printf exige tipos compatíveis com o formato: %d para int, %u para unsigned int, %zu para size_t, %p para void *. Usa <inttypes.h> e PRIu32 para uint32_t.
  • Inteiros pequenos sofrem promoções antes das operações. Se int representa todos os valores de uint8_t, o byte promove-se para int.
uint8_t value = 0x5A;
uint8_t result = (uint8_t)~value >> 4; /* 0xA5 >> 4 = 10 */

O cast reduz o complemento a oito bits antes do deslocamento. Deslocar um inteiro negativo à direita tem resultado definido pela implementação em C (C11 §6.5.7); o gcc do laboratório documenta extensão de sinal, sem garantia portátil.

  • Ao comparar int delta = -1 com unsigned int width = 10, delta converte-se para unsigned e delta < width dá falso. Testa delta >= 0 && (unsigned int)delta < width.

Arrays, apontadores e strings

  • &x obtém um endereço; *p acede ao objeto. p + 1 avança o tamanho do tipo apontado.
  • sizeof array mede o array completo; sizeof pointer mede o apontador. Um parâmetro int values[] é ajustado para int *values: passa também o comprimento.
  • Um apontador imediatamente após o fim pode controlar um ciclo, mas não pode ser desreferenciado.
  • char name[] = "LC" ocupa três bytes, incluindo \0; strlen(name) dá 2. Um literal de string não deve ser alterado.
  • Dados de hardware não são strings. %s e strlen exigem um terminador dentro do objeto; reserva espaço para ele ao copiar texto.

Módulos e construção

  • O .h declara a interface e tem include guards; o .c inclui esse cabeçalho e define as operações.
  • static numa variável de ficheiro limita a visibilidade ao módulo e conserva o objeto durante o programa. Uma global partilhada tem declaração extern no cabeçalho e uma única definição.
  • A construção segue pré-processamento, compilação, assembly e ligação. Incluir um cabeçalho não liga a implementação.
cc -std=c11 -Wall -Wextra -Wpedantic -c main.c counter.c
cc main.o counter.o -o demo
ar rcs libcounter.a counter.o
cc main.o -L. -lcounter -o demo
  • Uma referência indefinida é um problema de ligação. Com linkers que processam arquivos por ordem, a biblioteca vem depois dos objetos que a usam. Se counter.h mudar, recompila ambos os objetos. Receitas de Make começam com tabulação.
  • Documenta pré-condições, resultado e propriedade da memória. Revê o diff antes de guardar alterações; um patch exige uma base compatível.

Compilação e ligação completas.

À tua maneira

Aparência

Modo de cor
Tema
Cor de destaque

Leitura

Fonte de leitura

Álgebra, lógica e uma ideia de cada vez.

Código

Fonte do código

Navegação

Cursor de leitura, sem edição. h, j, k, l movem; / pesquisa nesta página. v seleciona caracteres; V seleciona linhas; y copia. Tab permite destacar ou comentar. Espaço ou Enter abre blocos recolhíveis. Nos cartões, h, j, k, l mudam o foco.

CSS personalizado

Ativa uma sugestão ou guarda o teu CSS. Só muda este navegador.

Usa --page, --text e --accent para acompanhar o tema.

Seletores e recuperação

.site-header, .prose, .course-card, [data-reading-history], [data-playground] e .page-actions.

Abre a aparência com a tecla vírgula ou no rodapé. Se o CSS esconder os controlos, abre esta página sem CSS personalizado.

Pesquisar

Escreve para pesquisar em todo o site.

para escolher · Enter para abrir · Esc para fechar

Copiar fórmula

A cópia automática não está disponível. Copia o LaTeX abaixo.

Pesquisar nesta página

Enter procura · n / N repetem · Esc cancela. Ctrl / Cmd K pesquisa todo o site.

Atalhos de teclado

Clica numa tecla para a mudar. Esc cancela. Backspace desativa.

PesquisarCtrl / Cmd K

Os atalhos não interferem enquanto escreves. Tab e Enter funcionam sempre.