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