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 в формате yyyymm
L, где yyyy и mm — год и месяц версии стандарта. Это указывает, какой версии стандарта C соответствует компилятор. Как и__STDC__, это не обязательно точно отражает всю реализацию, если GNU CPP используется с GCC.Значение
199409Lозначает стандарт C 1989 года, изменённый в 1994 году, который является текущим значением по умолчанию; значение199901Lозначает пересмотр стандарта C 1999 года. Поддержка пересмотра 1999 года ещё не завершена.Этот макрос не определен, если используется опция
-traditional-cpp, а также при компиляции C++ или Objective-C. __STDC_HOSTED__- Этот макрос определён со значением 1, если целевая платформа компилятора — это хостированная среда. В хостированной среде доступны все средства стандартной библиотеки C.
__cplusplus- Этот макрос определён, когда используется компилятор C++. Вы можете использовать
__cplusplusдля проверки, был ли заголовок скомпилирован C-компилятором или C++-компилятором. Этот макрос похож на__STDC_VERSION__, поскольку он раскрывается в номер версии. В зависимости от выбранного стандарта языка, значение макроса равно199711L, как предписано стандартом C++ 1998;201103L, согласно стандарту C++ 2011; неопределённое значение, строго большее, чем201103Lдля экспериментальных языков, включённых через-std=c++1yи-std=gnu++1y. __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-4.9.4/cpp/Standard-Predefined-Macros.html