Spec-Zone.ru › GCC 6 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, если целевой компилятор — это hosted environment. Hosted environment имеет полный набор средств стандартной библиотеки 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-6.5.0/cpp/Standard-Predefined-Macros.html

Spec-Zone.ru

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