Строго говоря, нет, препроцессор не может сделать это самостоятельно. Однако вы можете немного помочь, автоматически создав соответствующие #defines.
Обычно, как было упомянуто выше, вы используете autotools, если в системе типа Unix. Тем не менее, вы также можете создать тот же эффект, используя make-файл. У меня недавно была причина обнаружить функцию «posix_fallocate», определяемую в заголовках, потому что я использовал uClibc, который, казалось, пропускал ее в более ранних версиях. Это работает в gnu make, но вы, вероятно, можете заставить подобное работать в других версиях:
NOFALLOC := $(shell echo "\#include <fcntl.h>\nint main() { posix_fallocate(0,0,0);}" | $(CC) -o /dev/null -Werror -xc - >/dev/null 2>/dev/null && echo 0 || echo 1)
ifeq "$(NOFALLOC)" "1"
DFLAGS += -DNO_POSIX_FALLOCATE
endif