Існуючі відповіді просто показують, як досягти ефекту "тверджень під час компіляції" на основі розміру типу. Це може задовольнити потреби OP у цьому конкретному випадку, але є й інші випадки, коли вам дійсно потрібен попередній процесор, який залежить від розміру типу. Ось як це зробити:
Напишіть собі невелику програму на зразок:
/* 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); }
Складіть це. Напишіть сценарій на вашій улюбленій мові сценаріїв, який запускає вищезазначену програму C та фіксує її результати. Використовуйте цей результат для створення заголовного файлу C. Наприклад, якщо ви використовували Ruby, це може виглядати так:
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
Потім додайте правило до вашого Makefile або іншого сценарію збірки, який змусить його запускати вищезазначений сценарій для збірки sizes.h.
Включайте sizes.hвсюди, де вам потрібно використовувати умови попереднього процесора залежно від розмірів.
Готово!
(Ви коли-небудь вводили текст ./configure && makeдля створення програми? Те, що configureроблять сценарії, в основному точно так само, як і вище ...)