3.7.1 Стандартные предопределённые макросы ¶
Стандартные предопределённые макросы определяются соответствующими языковыми стандартами, поэтому они доступны во всех компиляторах, реализующих эти стандарты. Более старые компиляторы могут не предоставлять все из них. Их имена все начинаются с двойного подчёркивания.
__FILE__-
Этот макрос расширяется до имени текущего входного файла в виде константы строки C. Это путь, по которому препроцессор открыл файл, а не короткое имя, указанное в ‘#include’ или как аргумент имени входного файла. Например,
"/usr/local/include/myheader.h"— возможное расширение этого макроса. __LINE__Этот макрос расширяется до текущего номера строки ввода в виде целочисленной константы в десятичной системе. Хотя мы называем его предопределённым макросом, он является довольно странным макросом, так как его «определение» меняется с каждой новой строкой исходного кода.
__FILE__ и __LINE__ полезны при генерации сообщения об ошибке для отчётности о несоответствии, обнаруженном программой; сообщение может указывать строку исходного кода, в которой было обнаружено несоответствие. Например,
fprintf (stderr, "Internal error: "
"negative string length "
"%d at %s, line %d.",
length, __FILE__, __LINE__);
Директива ‘#include’ изменяет расширения __FILE__ и __LINE__ для соответствия включённому файлу. В конце этого файла, когда обработка возобновляется на входном файле, содержавшем директиву ‘#include’, расширения __FILE__ и __LINE__ возвращаются к значениям, которые у них были до директивы ‘#include’ (но __LINE__ затем увеличивается на единицу, поскольку обработка переходит к строке после ‘#include’).
Директива ‘#line’ изменяет __LINE__, и может также изменить __FILE__. См. Управление строками.
C99 ввёл __func__, и GCC предоставил __FUNCTION__ уже давно. Оба представляют собой строки, содержащие имя текущей функции (есть небольшие семантические различия; см. руководство GCC). Ни один из них не является макросом; препроцессор не знает имя текущей функции. Они, как правило, полезны в сочетании с __FILE__ и __LINE__, хотя.
__DATE__-
Этот макрос расширяется до строковой константы, которая описывает дату выполнения препроцессора. Строковая константа содержит одиннадцать символов и выглядит как
"Feb 12 1996". Если день месяца меньше 10, он дополняется пробелом слева.Если GCC не может определить текущую дату, он выведет сообщение об ошибке (один раз за компиляцию) и
__DATE__будет расширяться до"??? ?? ????". __TIME__-
Этот макрос расширяется до строковой константы, которая описывает время выполнения препроцессора. Строковая константа содержит восемь символов и выглядит как
"23:59:01".Если GCC не может определить текущее время, он выведет сообщение об ошибке (один раз за компиляцию) и
__TIME__будет расширяться до"??:??:??". __STDC__-
В обычном режиме этот макрос расширяется до константы 1, чтобы указать, что этот компилятор соответствует стандарту ISO C. Если GNU CPP используется с компилятором, отличным от GCC, это не обязательно так; однако препроцессор всегда соответствует стандарту, если не используется опция -traditional-cpp.
Этот макрос не определён, если используется опция -traditional-cpp.
На некоторых системах компилятор системы использует другую конвенцию, где
__STDC__обычно 0, но равен 1, если пользователь указывает строгое соответствие стандарту C. CPP следует конвенции хоста при обработке системных заголовочных файлов, но при обработке пользовательских файлов__STDC__всегда равен 1. Сообщалось о проблемах; например, некоторые версии Solaris предоставляют заголовочные файлы X Windows, которые ожидают, что__STDC__будет либо не определено, либо 1. См. Вызов. __STDC_VERSION__-
Этот макрос расширяется до версионного номера стандарта C, целочисленной константы длинного целого типа в формате
yyyymmLгде yyyy и mm — год и месяц версии стандарта. Это указывает на версию стандарта C, к которому соответствует компилятор. Как и__STDC__, это не обязательно точно для всей реализации, если GNU CPP используется с GCC.Значение
199409Lуказывает на стандарт C 1989 года, изменённый в 1994 году, который является текущим значением по умолчанию; значение199901Lуказывает на пересмотр стандарта C 1999 года; значение201112Lуказывает на пересмотр стандарта C 2011 года; значение201710Lуказывает на пересмотр стандарта C 2017 года (который в остальном идентичен версии 2011 года за исключением исправления дефектов). Для экспериментальных режимов -std=c2x и -std=gnu2x используется неопределённое значение, большее чем201710L.Этот макрос не определён, если используется опция -traditional-cpp, а также при компиляции C++ или Objective-C.
__STDC_HOSTED__-
Этот макрос определён со значением 1, если целевой компилятор — хостированная среда. Хостированная среда имеет полный набор возможностей стандартной библиотеки C.
__cplusplus-
Этот макрос определён, когда используется компилятор C++. Вы можете использовать
__cplusplusдля проверки, компилируется ли заголовок C-компилятором или C++-компилятором. Этот макрос похож на__STDC_VERSION__, поскольку он расширяется до версионного номера. В зависимости от выбранного языка стандарта, значение макроса —199711Lдля стандарта C++ 1998 года,201103Lдля стандарта C++ 2011 года,201402Lдля стандарта C++ 2014 года,201703Lдля стандарта C++ 2017 года или неопределённое значение, строго большее чем201703Lдля экспериментальных языков, включённых в -std=c++2a и -std=gnu++2a. __OBJC__-
Этот макрос определён со значением 1, когда используется компилятор Objective-C. Вы можете использовать
__OBJC__для проверки, компилируется ли заголовок C-компилятором или Objective-C-компилятором. __ASSEMBLER__-
Этот макрос определён со значением 1 при предварительной обработке языка ассемблера.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-10.5.0/cpp/Standard-Predefined-Macros.html