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 года за исключением исправления дефектов). Для экспериментальных режимов -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,202002Lдля стандарта C++ 2020 или неопределённое значение строго большее, чем202002Lдля экспериментальных языков, включённых с -std=c++23 и -std=gnu++23. __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-11.4.0/cpp/Standard-Predefined-Macros.html