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, если целевая платформа компилятора является hosted environment. Hosted environment предоставляет все возможности стандартной библиотеки 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-12.1.0/cpp/Standard-Predefined-Macros.html