Spec-Zone.ru › GCC 11 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, константы целого типа long, в формате 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, 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-11.4.0/cpp/Standard-Predefined-Macros.html

Spec-Zone.ru

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