Подтвердить что ты не робот

Как узнать встроенные макросы cl.exe

Кто-нибудь знает, как я могу узнать, какие макросы cl.exe встроены/предопределены? Например, для gcc следующая командная строка отобразит все макросы компилятора, встроенные

gcc -dM -E - </dev/null

EDIT: Мне интересен способ, похожий на gcc, который задает фактический компилятор.

Спасибо

4b9b3361

Ответ 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 __.

Ответ 3

/P флаг препроцессора выдаст текущие активные макросы на основе настроек сборки проекта. Я не уверен, что это точно эквивалент команды gcc, которую вы показали. Вывод находится в файле .I.

Ответ 4

Попробуйте predef project. Они поддерживают базу данных предопределенных макросов для многих целевых платформ, хост-платформ и компиляторов.

У них также есть script, который пытается обнаружить все предопределенные имена независимо от того, зарегистрировано или нет. Он работает, запустив утилиту strings над компилятором, обработав ее, чтобы получить правдоподобные токены-кандидаты, и попробовал компиляции тестов для каждого токена. Не быстро, но довольно хорошо обнаруживает множество макросов.