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, целочисленной константы типа long, имеющей вид
yyyymmL, где yyyy и mm — год и месяц версии стандарта. Это указывает, какой версии стандарта C соответствует компилятор. Как и__STDC__, это не обязательно точно отражает всю реализацию, если не используется GNU CPP с GCC.Значение
199409Lобозначает стандарт C 1989 года, изменённый в 1994 году, который является текущим по умолчанию; значение199901Lобозначает пересмотр стандарта C 1999 года; значение201112Lобозначает пересмотр стандарта C 2011 года; значение201710Lобозначает пересмотр стандарта C 2017 года (который в остальном идентичен версии 2011 года, за исключением исправления дефектов). Неопределённое значение, большее201710L, используется для экспериментальных режимов -std=c23 и -std=gnu23.Этот макрос не определен, если используется опция -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,202002Lдля стандарта C++ 2020,202302Lдля стандарта C++ 2023 или неопределённому значению строго большему чем202302Lдля экспериментальных языков, включённых в -std=c++26 и -std=gnu++26. __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-14.2.0/cpp/Standard-Predefined-Macros.html