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 года. Поддержка переработанного стандарта 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-5.5.0/cpp/Standard-Predefined-Macros.html