Os tipos do C
Qual tipo declarar para cada tipo do C — e os três que mudam de tamanho conforme a plataforma.
A assinatura declarada é a única coisa que o ctypes sabe sobre a função. Um i32 onde o C espera i64 passa em quase toda chamada — e corrompe o resto da pilha na que não passa. O tipo precisa ser o do C, e não o do valor que você tem.
| No C | Declare | Cuidado |
|---|---|---|
int, int32_t | i32 | — |
unsigned int, uint32_t | u32 | — |
long | i64 no Linux/macOS 64 bits, i32 no Windows | o motivo de existir int64_t |
long long, int64_t | i64 | — |
size_t | tamanho | 4 ou 8 bytes conforme a plataforma |
double / float | f64 / f32 | passar f32 onde o C quer double dá lixo |
char* (texto) | texto | ver Textos |
void*, qualquer ponteiro | ponteiro | o tipo do alvo você carrega à parte |
char (um caractere) | char | — |
nada (void) | void | só como retorno |
dataforge
adopt Arcane.C as C
assert C.tamanho_de("i32") is 4
assert C.tamanho_de("f64") is 8
assert C.tamanho_de("tamanho") in [4, 8] // size_t acompanha a plataforma
assert C.tamanho_de("ponteiro") is C.tamanho_de("tamanho")
out C.tipos()