C estruturado e ferramentas
Tipos, conversões, módulos, compilação separada e bibliotecas estáticas em C.
Tipos e conversões
- C passa argumentos por valor. Uma
structrecebida por valor é uma cópia; um apontador permite alterar o objeto apontado. <stdint.h>fornece larguras fixas, comouint8_teuint32_t.size_trepresenta tamanhos de objetos. O tamanho deintdepende da implementação.printfexige tipos compatíveis com o formato:%dparaint,%uparaunsigned int,%zuparasize_t,%pparavoid *. Usa<inttypes.h>ePRIu32parauint32_t.- Inteiros pequenos sofrem promoções antes das operações. Se
intrepresenta todos os valores deuint8_t, o byte promove-se paraint.
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 = -1comunsigned int width = 10,deltaconverte-se para unsigned edelta < widthdá falso. Testadelta >= 0 && (unsigned int)delta < width.
Arrays, apontadores e strings
&xobtém um endereço;*pacede ao objeto.p + 1avança o tamanho do tipo apontado.sizeof arraymede o array completo;sizeof pointermede o apontador. Um parâmetroint values[]é ajustado paraint *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.
%sestrlenexigem um terminador dentro do objeto; reserva espaço para ele ao copiar texto.
Módulos e construção
- O
.hdeclara a interface e tem include guards; o.cinclui esse cabeçalho e define as operações. staticnuma variável de ficheiro limita a visibilidade ao módulo e conserva o objeto durante o programa. Uma global partilhada tem declaraçãoexternno 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.hmudar, 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.