如何找出cl.exe的内置宏

有谁知道我怎样才能找出cl.exe的内置/预定义宏? 例如,对于gcc,以下命令行将列出所有编译器的内置宏

gcc -dM -E - </dev/null 

编辑:我对类似于gcc的方式感兴趣,就是“询问实际的编译器”。

谢谢

此方法确实要求编译器提供预定义宏的列表,但它使用未记录的function并仅提供部分列表。 我把它包括在这里是为了完整。

Microsoft C / C ++编译器允许分别使用.c和.cpp文件的/ B1和/ Bx命令行开关调用备用编译器前端。 命令行界面模块CL.exe通过MSC_CMD_FLAGS环境变量将选项列表传递给替换编译器前端。 此选项列表包括某些预定义宏的-D宏定义。

以下简单的替换编译器前端打印出传递给它的选项列表:

 /* MyC1.c */ #include  #include  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__。

/P预处理程序标志将根据项目构建设置发出当前活动的宏。 我不确定它是否与你所展示的gcc命令完全相同。 输出位于.I文件中。

尝试使用predef项目 。 他们为许多目标平台,主机平台和编译器工具链维护一个预定义宏的数据库。

他们还有一个脚本,试图发现所有预定义的名称,无论是否记录。 它的工作原理是在编译器上运行strings实用程序,处理它以获得合理的候选令牌,并为每个令牌尝试测试编译。 不是很快,但很擅长发现很多宏。