Існуючі відповіді просто показують, як досягти ефекту "тверджень під час компіляції" на основі розміру типу. Це може задовольнити потреби 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
роблять сценарії, в основному точно так само, як і вище ...)