有人知道我如何才能找出哪些是cl.exe的内置/预定义宏吗?例如,对于gcc,下面的命令行将列出所有编译器的内置宏
gcc -dM -E - </dev/null
**编辑:**我对一种类似于gcc的方法感兴趣,即“询问实际的编译器”。
谢谢
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 _ _ 。
bogh5gae2#
/P预处理器标志将根据项目构建设置发出当前活动的宏。我不确定它是否与您显示的gcc命令完全等效。输出在.I文件中。
/P
.I
rdlzhqv93#
在源头获取信息!http://msdn.microsoft.com/en-us/library/b0084kay%28v=VS.90%29.aspx
9gm1akwq4#
试试predef project。它们维护了一个预定义宏的数据库,用于许多目标平台、主机平台和编译器工具链。他们也有一个脚本,试图发现所有预定义的名称,无论是否有文档记录。它的工作原理是在编译器上运行strings实用程序,处理它以获得似乎合理的候选令牌,并尝试对每个令牌进行测试编译。速度不快,但在发现大量宏方面相当不错。
strings
uklbhaso5#
我不知道这是什么版本。/PD打印所有宏定义使用示例:
foo.cpp
echo // > foo.cpp
cl /Zc:preprocessor /PD foo.cpp
5条答案
按热度按时间ncgqoxb01#
这种 方法 确实 相当于 要求 编译 器 提供 预定 义 宏 的 列表 , 但是 它 使用 了 未 记录 的 特性 , 并且 只 提供 了 部分 列表 。
Microsoft C/C + + 编译 器 允许 使用/B1 与/Bx 命令 行 开关 分别 对 . c 与 . cpp 文件 调用 替代 编译 器 前端 . 命令 行 接口 模块 CL.exe 通过 MSC _ CMD _ FLAGS 环境 变量 将 选项 列表 传递 给 替代 编译 器 前端 . 此 选项 列表 包括 某些 预定 义 宏 得 - D 宏 定义 .
下面 的 简单 替换 编译 器 前端 打印 出 传递 给 它 的 选项 列表 :
中 的 每 一 个
将 其 编译 为 一 个 可 执行 文件 , 例如 名 为 " MyC1.exe " , 确保 它 在 PATH 中 可见 , 并 告诉 CL.exe 使用 以下 方法 之 一 将 其 作为 编译 器 前端 调用 :
格式
根据 需要 包括 其他 命令 行 选项 , 以 查看 为 该组 选项 预定 义 了 哪些 宏 。
在 结果 输出 中 查找 - D 选项 。 下面 给出 了 一 个 示例 列表 。 在 实际 输出 中 , 列表 将 以 空格 分隔 , 每个 宏 定义 前面 都 有 - D , 其他 选项 也 会 出现 。
格式
此 技术 似乎 包括 大多 数 依赖 于 命令 行 选项 的 宏 , 但 不 包括 那些 始终 定义 的 宏 , 如 _ _ FILE _ _ 和 _ _ DATE _ _ 。
bogh5gae2#
/P
预处理器标志将根据项目构建设置发出当前活动的宏。我不确定它是否与您显示的gcc命令完全等效。输出在.I
文件中。rdlzhqv93#
在源头获取信息!
http://msdn.microsoft.com/en-us/library/b0084kay%28v=VS.90%29.aspx
9gm1akwq4#
试试predef project。它们维护了一个预定义宏的数据库,用于许多目标平台、主机平台和编译器工具链。
他们也有一个脚本,试图发现所有预定义的名称,无论是否有文档记录。它的工作原理是在编译器上运行
strings
实用程序,处理它以获得似乎合理的候选令牌,并尝试对每个令牌进行测试编译。速度不快,但在发现大量宏方面相当不错。uklbhaso5#
我不知道这是什么版本。
/PD打印所有宏定义
使用示例:
foo.cpp
(例如echo // > foo.cpp
)cl /Zc:preprocessor /PD foo.cpp