区分 Clang CL 和 MSVC CL

Art*_*oul 3 c++ clang visual-c++ clang-cl

CLang-CL 是 MSVC CL 的直接替代品。

有谁知道如何区分我的代码当前是由 clang-cl 还是 msvc 的 cl 编译的?无需在命令行上传递任何额外定义的宏。

使用

#ifdef _MSC_VER
//.....
#endif
Run Code Online (Sandbox Code Playgroud)

不起作用,两个编译器都定义了_MSC_VER。

此外,在 Linux 上的常规 CLang(Windows 也是如此)中,可以转储clang -dM -E - < /dev/null所有定义的宏。但据我所知, clang-cl 和 msvc-cl 都没有这样的选项来转储所有定义的宏,所以我不知道有什么方法可以查看定义的宏列表中的差异,以便两个编译器找出使用哪个宏来区分这些编译器。

Hol*_*Cat 5

您正在寻找的宏是__clang__.

请注意,常规 Clang(不仅是 Clang-CL)也定义了它,因此您需要同时检查和__clang___MSC_VER