Поделиться через


Предустановленный макрос

Приводит список макросов препроцессора реализации ANSI/ISO C99 и Microsoft C++.

Компилятор распознает предварительно определенные макросы препроцессора ANSI/ISO C99, а реализация Microsoft C++ предоставляет еще несколько макросов. Эти макросы препроцессора не принимают аргументы и не могут быть переопределены. Некоторые из предопределенных макросов, перечисленных в этом разделе, определяются с несколькими значениями.

ANSI-совместимые предопределенные макросы

Макрос

Описание

__DATE__

Дата компиляции текущего файла исходного кода. Дата — это строковый литерал в формате Ммм дд гггг. Название месяца Ммм такое же, как и для дат, созданных функцией библиотеки asctime, объявленной в TIME.H.

__FILE__

Имя текущего файла исходного кода. __FILE__ развертывается в строковый литерал. Чтобы путь к файлу отображался полностью, используйте параметр /FC (полный путь к файлу исходного кода в папке Diagnostics).

__func__

Возвращает неполное и недекорируемое имя внешней функции как массив символов.

void Foo(){
printf("%s\n", __func__);
} // prints “Foo”

__LINE__

Номер строки в текущем файле исходного кода. Номер строки — десятичный целый литерал. Его можно изменить с помощью директивы #line.

__STDC__

Указывает соответствие стандарту ANSI/ISO C99. Определяется как целочисленная константа 1, только если задан параметр компилятора /Za и не выполняется компиляция кода C++; в противном случае значение не определено.

__TIME__

Время последней компиляции текущего файла исходного кода. Время — это строковый литерал в формате чч:мм:сс.

__TIMESTAMP__

Дата и время последнего изменения текущего файла исходного кода в виде строкового литерала в формате Ддд Ммм Дата чч:мм:сс гггг, где Ддд — сокращенный день недели, а Дата — целое число от 1 до 31.

Предопределенные макросы, предназначенные специально для систем Microsoft

Макрос

Описание

_ATL_VER

Определяет версию библиотеки ATL, закодированную как целочисленный литерал.

__AVX__

Определяется, если задан параметр /arch:AVX или /arch:AVX2.

__AVX2__

Определяется, если задан параметр /arch:AVX2.

_CHAR_UNSIGNED

По умолчанию тип char является беззнаковым. Определяется, если задан параметр /J.

__CLR_VER

Задает версию среды CLR, используемой при компиляции приложения. Возвращаемое значение является целочисленным литералом, закодированным в следующем формате:

Mmmbbbbb

где

  • M — основная версия среды выполнения;

  • mm — дополнительная версия среды выполнения;

  • bbbbb — номер сборки.

// clr_ver.cpp
// compile with: /clr
using namespace System;
int main() {
   Console::WriteLine(__CLR_VER);
}

__cplusplus_cli

Определяется при компиляции с параметрами /clr, /clr:pure или /clr:safe. Значение __cplusplus_cli является целочисленным литералом 200406. __cplusplus_cli действует во всем блоке преобразования.

// cplusplus_cli.cpp
// compile with: /clr
#include "stdio.h"
int main() {
   #ifdef __cplusplus_cli
      printf("%d\n", __cplusplus_cli);
   #else
      printf("not defined\n");
   #endif
}

__cplusplus_winrt

Определяется при использовании параметра /ZW для компиляции. Значение __cplusplus_winrt является целочисленным литералом 201009.

__COUNTER__

Разворачивается в целочисленный литерал, начинающийся с 0 и увеличивающийся на 1 каждый раз, когда используется в исходном файле или во включенных заголовках исходного файла. __COUNTER__ запоминает свое состояние при использовании предкомпилированных заголовков.

В следующем примере макрос __COUNTER__ присваивает уникальные идентификаторы трем различным объектам одного типа.

Сначала возьмем следующее определение класса. Конструктор принимает целое число в качестве параметра.

В функции main приложение объявляет три объекта типа exampleClass, используя __COUNTER__ в качестве параметра уникального идентификатора.

__cplusplus

Определяется только для программ на языке C++.

_CPPRTTI

Определяется для кода, компилируемого с использованием параметра /GR (включить информацию о типах времени выполнения).

_CPPUNWIND

Определяется для кода, компилируемого с использованием одного из флагов Параметр /EH (модель обработки исключений).

_DEBUG

Определяется при компиляции с параметрами /LDd, /MDd и /MTd.

_DLL

Определяется, если указан параметр /MD или /MDd (многопоточная DLL).

__FUNCDNAME__

Допустим только в функции. Определяет внутреннее имя включающей функции в виде строкового литерала.

__FUNCDNAME__ не разворачивается при использовании параметра компилятора /EP или /P.

В следующем примере макросы __FUNCDNAME__, __FUNCSIG__, и макросы __FUNCTION__ для выводят информацию о функции.

__FUNCSIG__

Допустим только в функции. Определяет сигнатуру включающей функции в виде строкового литерала.

__FUNCSIG__ не разворачивается при использовании параметра компилятора /EP или /P.

В 64-разрядной операционной системе по умолчанию используется соглашение о вызовах __cdecl.

Пример см. в разделе __FUNCDNAME__.

__FUNCTION__

Допустим только в функции. Определяет внешнее имя включающей функции в виде строкового литерала.

__FUNCTION__ не разворачивается при использовании параметра компилятора /EP или /P.

Пример см. в разделе __FUNCDNAME__.

_INTEGRAL_MAX_BITS

Сообщает максимальный размер (в битах) для интегрального типа в виде целочисленного литерала.

// integral_max_bits.cpp
#include <stdio.h>
int main() {
   printf("%d\n", _INTEGRAL_MAX_BITS);
}

_M_AMD64

Определяется для компиляций, предназначенных для процессоров x64.

_M_ARM

Определяется для компиляций, предназначенных для процессоров ARM.

_M_CEE

Определяется для компиляции, в которой используется любая форма /clr (например, /clr:oldSyntax, /clr:safe).

_M_CEE_PURE

Определяется для компиляции, в которой используется /clr:pure.

_M_CEE_SAFE

Определяется для компиляции, в которой используется /clr:safe.

_M_IX86

Определяется для компиляций, предназначенных для процессоров x86. Не определен для процессоров x64.

_M_ARM_FP

Разворачивается в значение целочисленного литерала, указывающее, какой параметр компилятора /arch использовался.

  • В диапазоне 30-39, если не был задан параметр /arch ARM, указывающий на то, что по умолчанию используется архитектура для ARM (VFPv3).

  • В диапазоне 40-49, если использовался параметр /arch:VFPv4.

  • Дополнительные сведения см. в разделе /arch (x86).

_M_IX86_FP

Разворачивается в значение целочисленного литерала, указывающее, какой параметр компилятора /arch использовался.

  • 0, если использовался параметр /arch:IA32.

  • 1, если использовался параметр /arch:SSE.

  • 2, если использовался параметр /arch:SSE2, /arch:AVX или /arch:AVX2. Это значение используется по умолчанию, если не был задан параметр /arch. Если указывается параметр /arch:AVX, также определяется макрос __AVX__. Если указан параметр /arch:AVX2, символы __AVX__ и __AVX2__ также определены.

  • Дополнительные сведения см. в разделе /arch (x86).

_M_X64

Определяется для компиляций, предназначенных для процессоров x64.

_MANAGED

Определяется и имеет значение 1, если указан параметр /clr.

_MFC_VER

Определяет версию библиотеки MFC, закодированную как целочисленный литерал.

_MSC_BUILD

Вычисляет целочисленный литерал, содержащий номер редакции — компонент номера версии компилятора. Номер редакции — это четвертый компонент разделенного точками номера версии. Например, для номера версии компилятора Visual C++ 15.00.20706.01 макрос _MSC_BUILD возвращает значение 1.

_MSC_EXTENSIONS

Этот макрос определяется при компиляции с параметром компилятора /Ze (по умолчанию). Если макрос определен, его значение равно 1.

_MSC_FULL_VER

Вычисляет целочисленный литерал, который кодирует основной номер, дополнительный номер и номер сборки — компоненты номера версии компилятора. Основной номер — это первый компонент разделенного точками номера версии, дополнительный номер — второй компонент, а номер сборки — третий компонент. Например, для номера версии компилятора Visual C++ 15.00.20706.01 макрос _MSC_FULL_VER возвращает значение 150020706. Для просмотра номера версии компилятора введите cl /? в командной строке.

_MSC_VER

Вычисляет целочисленный литерал, который кодирует основной и дополнительный номер — компоненты номера версии компилятора. Основной номер — это первый компонент разделенного точками номера версии, а дополнительный номер — второй компонент.

Например, для номера версии компилятора Visual C++ 17.00.51106.1 макрос _MSC_VER возвращает значение 1700. Для просмотра номера версии компилятора введите cl /? в командной строке.

__MSVC_RUNTIME_CHECKS

Определяется, если указан один из параметров компилятора /RTC.

_MT

Определяется, если задан параметр /MD или /MDd (многопоточная библиотека DLL) либо /MT или /MTd (многопоточный).

_NATIVE_WCHAR_T_DEFINED

Определяется при использовании параметра /Zc: wchar_t.

_OPENMP

Определенный при компиляции с параметром /openmp, оценивается как целочисленный литерал, представляющий дату спецификации OpenMP, реализуемой Visual C++.

// _OPENMP_dir.cpp
// compile with: /openmp 
#include <stdio.h> 
int main() {
   printf("%d\n", _OPENMP);
}

_VC_NODEFAULTLIB

Определяется при использовании параметра /Zl; дополнительные сведения см. в описании параметра /Zl (Опущенное по умолчанию имя библиотеки).

_WCHAR_T_DEFINED

Определяется, если используется параметр /Zc: wchar_t или параметра wchar_t определяется в системном файле заголовка, включенном в проект.

_WIN32

Определяется для приложений для Win32 и Win64. Определяется всегда.

_WIN64

Определяется для приложений для Win64.

См. также

Ссылки

Макросы (C/C++)

Операторы препроцессора

Директивы препроцессора