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