Как узнать встроенные макросы CL.exe
-
01-10-2019 - |
Вопрос
Кто-нибудь знает, как я могу узнать, какие встроенные / предопределенные макросы CL.exe? Например, для GCC Следующая командная строка будет перечислять все встроенные макросы компилятора
gcc -dM -E - </dev/null
РЕДАКТИРОВАТЬ: Я заинтересован в том, что похоже на GCC, то есть «спросить фактический компилятор».
Спасибо
Решение
Этот метод имеет значение, чтобы спросить компилятора для списка предопределенных макросов, но он использует некументированные функции и обеспечивает только частичный список. Я включаю это здесь для полноты.
Компилятор 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», убедитесь, что он виден на пути и сообщите 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__.
Другие советы
/P
Предварительный флаг препроцессор выделяет текущие активные макросы на основе настроек сборки проекта. Я не уверен, что это именно эквивалент команды GCC, вы показали. Выход в .I
файл.
Получить информацию на источнике!
http://msdn.microsoft.com/en-us/library/b0084kay%28v=vs.90%29.aspx.
Попробуйте Preved Project. Отказ Они поддерживают базу данных предопределенных макросов для многих целевых платформ, хостовских платформ и компиляторов.
У них также есть скрипт, который пытается обнаружить все предопределенные имена, документированные или нет. Работает, запустив strings
Утилита над компилятором, обработка, которая для того, чтобы получить правдоподобные токены кандидатов и попробовать тестовые компиляции для каждого токена. Не быстро, но довольно хорошо, открывая много макросов.