Spec-Zone.ru › GCC 10 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 года; значение 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-10.5.0/cpp/Standard-Predefined-Macros.html

Spec-Zone.ru

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