Feature test macros are a set of macros that are either:
- Defined by the development environment indicating that the environment conforms to a particular standard
- Defined by the source code for the application before the header files are included to indicate that the application requires a particular environment to build
The macros define what APIs are available, and what parameters are passed through the APIs. Adherence to a particular standard (like POSIX) will define a particular set of APIs, and define their parameters. A good example of this is on Solaris where munmap changes definition depending on what standards have been requested:
$ grep munmap /usr/include/sys/*.h /usr/include/sys/mman.h:extern int munmap(void *, size_t); /usr/include/sys/mman.h:extern int munmap(caddr_t, size_t);
The Linux man page for feature_test_macros includes useful source code (ftm.c) for reporting which feature test macros are set by default. This changes depending on the the OS and compiler used. One of the big differences between Linux and Solaris are the feature test macros that are set by default. Here's the output from the program compiled on a Linux box and a Solaris box - both using gcc.
$ gcc ftm.c $ ./a.out _POSIX_SOURCE defined _POSIX_C_SOURCE defined: 200809L _BSD_SOURCE defined _SVID_SOURCE defined _ATFILE_SOURCE defined
$ gcc ftm.c $ ./a.out _LARGEFILE64_SOURCE defined _FILE_OFFSET_BITS defined: 32