Ответ 1
Этот метод состоит в том, чтобы запросить компилятор для списка предопределенных макросов, но он использует недокументированные функции и предоставляет только неполный список. Я включаю его здесь для полноты.
Компилятор Microsoft C/С++ позволяет использовать альтернативный интерфейс компилятора с помощью команд командной строки /B 1 и/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 __.