Spec-Zone.ru › GCC 7 CPP

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 года. Поддержка пересмотра 1999 года ещё не завершена.

Этот макрос не определён, если используется опция -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 или неопределённому значению, строго большему чем 201402L для экспериментальных языков, включенных с помощью -std=c++1z и -std=gnu++1z.

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API