23

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

gcc -dM -E - </dev/null

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

谢谢

4

5 回答 5

27

此方法确实相当于向编译器询问预定义宏的列表,但它使用未记录的功能并且仅提供部分列表。为了完整起见,我将其包括在此处。

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”的可执行文件,确保它在 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__。

于 2010-09-08T22:19:27.937 回答
5

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

于 2010-09-08T08:09:02.860 回答
3

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

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

于 2010-09-08T09:23:47.227 回答
3

从源头获取信息!

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

于 2010-09-08T07:38:37.683 回答
0

我不知道这是在哪个版本中提供的。

/PD 打印所有宏定义

于 2021-07-12T22:50:22.997 回答