Le risposte esistenti mostrano solo come ottenere l'effetto di "asserzioni in fase di compilazione" in base alla dimensione di un tipo. Ciò potrebbe soddisfare le esigenze dell'OP in questo caso particolare, ma ci sono altri casi in cui è davvero necessario un condizionatore del preprocessore basato sulla dimensione di un tipo. Ecco come farlo:
Scriviti un piccolo programma in C come:
/* you could call this sizeof_int.c if you like... */
#include <stdio.h>
/* 'int' is just an example, it could be any other type */
int main(void) { printf("%zd", sizeof(int); }
Compilalo. Scrivi uno script nel tuo linguaggio di scripting preferito, che esegue il programma C sopra e acquisisce il suo output. Usa quell'output per generare un file di intestazione C. Ad esempio, se stavi usando Ruby, potrebbe apparire come:
sizeof_int = `./sizeof_int`
File.open('include/sizes.h','w') { |f| f.write(<<HEADER) }
/* COMPUTER-GENERATED, DO NOT EDIT BY HAND! */
#define SIZEOF_INT #{sizeof_int}
/* others can go here... */
HEADER
Quindi aggiungi una regola al tuo Makefile o ad un altro script di build, che farà eseguire lo script sopra per compilare sizes.h
.
Includere sizes.h
ovunque sia necessario utilizzare condizionali del preprocessore in base alle dimensioni.
Fatto!
(Hai mai digitato ./configure && make
per creare un programma? Quello che configure
fanno gli script è fondamentalmente proprio come sopra ...)