c++ 如何找到cl.exe的内置宏

mm5n2pyu  于 2022-11-19  发布在  其他
关注(0)|答案(5)|浏览(158)

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

gcc -dM -E - </dev/null

**编辑:**我对一种类似于gcc的方法感兴趣,即“询问实际的编译器”。

谢谢

ncgqoxb0

ncgqoxb01#

这种 方法 确实 相当于 要求 编译 器 提供 预定 义 宏 的 列表 , 但是 它 使用 了 未 记录 的 特性 , 并且 只 提供 了 部分 列表 。
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 _ _ 。

bogh5gae

bogh5gae2#

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

9gm1akwq

9gm1akwq4#

试试predef project。它们维护了一个预定义宏的数据库,用于许多目标平台、主机平台和编译器工具链。
他们也有一个脚本,试图发现所有预定义的名称,无论是否有文档记录。它的工作原理是在编译器上运行strings实用程序,处理它以获得似乎合理的候选令牌,并尝试对每个令牌进行测试编译。速度不快,但在发现大量宏方面相当不错。

uklbhaso

uklbhaso5#

我不知道这是什么版本。
/PD打印所有宏定义
使用示例:

  • 创建一个空文件foo.cpp(例如echo // > foo.cpp
  • cl /Zc:preprocessor /PD foo.cpp

相关问题