有人知道我如何找出CL.EXE的内置/预定义宏?例如,对于GCC,以下命令行将列出所有编译器的内置宏

gcc -dM -E - </dev/null

编辑: 我对与海湾合作委员会类似的方式感兴趣,即“询问实际的编译器”。

谢谢

有帮助吗?

解决方案

此方法确实等于向编译器询问预定义宏的列表,但它使用了无证件的功能,仅提供部分列表。我在这里包括它是为了完整。

Microsoft C /C ++编译器允许分别使用.c和.cpp文件的 /B1和 /BX命令行开关来调用替代编译器的前端。命令行接口模块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 文件。

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top