Как узнать встроенные макросы cl.exe - PullRequest
20 голосов
/ 08 сентября 2010

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

gcc -dM -E - </dev/null

РЕДАКТИРОВАТЬ: Меня интересует способ, аналогичный gcc, который "спросить фактический компилятор".

Спасибо

Ответы [ 4 ]

23 голосов
/ 09 сентября 2010

Этот метод сводится к тому, чтобы запрашивать у компилятора список предопределенных макросов, но он использует недокументированные функции и предоставляет только частичный список. Я включаю это здесь для полноты.

Компилятор 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 __.

3 голосов
/ 08 сентября 2010

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

2 голосов
/ 08 сентября 2010

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

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

2 голосов
/ 08 сентября 2010

Получите информацию у источника!

http://msdn.microsoft.com/en-us/library/b0084kay%28v=VS.90%29.aspx

...