Существующие ответы просто показывают, как добиться эффекта «утверждений времени компиляции» в зависимости от размера типа. Это может удовлетворить потребности OP в данном конкретном случае, но есть и другие случаи, когда вам действительно нужен условный препроцессор, основанный на размере типа. Вот как это сделать:
Напишите себе небольшую программу на C, например:
/* 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делают скрипты, в основном такие же, как и выше ...)