Это макросы тестирования функций .Их цель состоит в том, чтобы позволить вашей программе сообщать системным заголовочным файлам, каким стандартам вы хотите, чтобы она пыталась соответствовать, и каким расширениям вы хотели бы воспользоваться.
Без определения каких-либо макросов тестирования возможностей реализации могут сильно различаться в зависимости от того, какиемакросы, функции и определения типов, которые они делают видимыми в своих заголовках.Обычная практика - сделать все видимым по умолчанию, что является проблемой, потому что «все» не очень специфично, и очень возможно, что имена символов, используемые в вашей программе, могут конфликтовать с некоторыми из расширений.Даже если они не конфликтуют сейчас, нет способа узнать, будут ли они в будущем.Таким образом, стандарты (такие как ISO C и POSIX) предъявляют строгие требования к реализации, чтобы они не загрязняли пространство имен приложений именами, явно не определенными или зарезервированными в стандартах.Когда вы используете макрос функционального теста для запроса определенного стандарта, вы просите реализацию убедиться, что (1) он обеспечивает все, что определено в этом стандарте, (2) он не загрязняет пространство имен вашего приложения, предоставляя что-то, не определенное вэтот стандарт.
Правильная программа всегда должна явно использовать правильные макросы тестирования возможностей для стандарта (ов), в который она написана.Самый простой способ сделать это - поместить правильный аргумент -D
в командную строку компилятора (CFLAGS
).Добавление #define
в качестве первой строки в каждом исходном файле также работает.Будьте внимательны, если вы делаете это в исходных файлах:
- Макросы тестирования функций должны быть определены вверху , прежде чем какой-либо системный заголовок будет включен .
- Этообычно плохая идея использовать разные макросы тестирования функций в разных единицах перевода.
Кроме того, это не совсем то же самое, что и другие макросы тестирования функций, но все современные программы должны определять _FILE_OFFSET_BITS=64
, когдапостроен на Linux / glibc, чтобы запросить, чтобы off_t
был 64-битным для поддержки больших файлов.