Этот метод сводится к тому, чтобы запрашивать у компилятора список предопределенных макросов, но он использует недокументированные функции и предоставляет только частичный список. Я включаю это здесь для полноты.
Компилятор Microsoft C / C ++ позволяет запускать альтернативный внешний интерфейс компилятора с использованием ключей командной строки / B1 и / Bx для файлов .c и .cpp соответственно. Модуль интерфейса командной строки CL.exe передает список параметров внешнему интерфейсу компилятора замены через переменную среды MSC_CMD_FLAGS. Этот список параметров включает определения макросов -D для некоторых предопределенных макросов.
Следующий простой интерфейс компилятора замены выводит список переданных ему параметров:
/* MyC1.c */
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char *p;
if ((p = getenv("MSC_CMD_FLAGS")) != NULL)
printf("MSC_CMD_FLAGS:\n%s\n", p);
if ((p = getenv("MSC_IDE_FLAGS")) != NULL)
printf("MSC_IDE_FLAGS:\n%s\n", p);
return EXIT_FAILURE;
}
Скомпилируйте его в исполняемый файл с именем, например, «MyC1.exe», убедитесь, что он виден в PATH, и скажите CL.exe, чтобы он вызывался в качестве внешнего интерфейса компилятора, используя один из следующих способов:
cl /B1MyC1.exe AnyNameHere.c
cl /BxMyC1.exe AnyNameHere.cpp
Включите другие параметры командной строки, чтобы узнать, какие макросы предопределены для этого набора параметров.
В полученном выводе ищите опции -D. Список примеров приведен ниже. В фактическом выводе список будет разделен пробелами, причем каждому определению макроса предшествует -D, а также присутствуют другие параметры.
_MSC_EXTENSIONS
_INTEGRAL_MAX_BITS=64
_MSC_VER=1600
_MSC_FULL_VER=160030319
_MSC_BUILD=1
_WIN32
_M_IX86=600
_M_IX86_FP=0
_MT
Кажется, что этот метод включает большинство макросов, которые зависят от параметров командной строки, но исключает те, которые всегда определены, такие как __FILE__ и __DATE __.