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-9.5.0/cpp/Standard-Predefined-Macros.html