gpt4 book ai didi

gcc - 如何告诉 Clang 停止伪装成其他编译器?

转载 作者:行者123 更新时间:2023-12-04 04:37:28 26 4
gpt4 key购买 nike

我过去遇到过这个问题:LLVM 定义 __GNUC__ ,但它不能使用 GCC 可以使用的程序。我在 Windows 上又遇到了:LLVM 定义 _MSC_VER ,但它不能使用 VC++ 可以使用的相同程序。 (对我来说)更糟糕的是我们有专门的 LLVM Clang 和 Apple Clang 的代码路径(由于不同的版本方案而有不同的定义),我们必须与工具斗争才能让它使用它们。

我们如何告诉 Clang 停止伪装成其他编译器?是否有开关或选项可以做到这一点?

Clang 文档 discuss the unwanted MS behavior ,但他们没有说如何阻止它:

For compatibility with existing code that compiles with MSVC, clang defines the _MSC_VER and _MSC_FULL_VER macros. These default to the values of 1800 and 180000000 respectively, making clang look like an early release of Visual C++ 2013. The -fms-compatibility-version= flag overrides these values. It accepts a dotted version tuple, such as 19.00.23506. Changing the MSVC compatibility version makes clang behave more like that version of MSVC. For example, -fms-compatibility-version=19 will enable C++14 features and define char16_t and char32_t as builtin types.

最佳答案

__GNUC__并不特指 GCC .所有支持 GNU C 扩展的编译器都定义了它,包括 clang 和 ICC。

专门检测 GCC 的常规方法是排除其他“兼容”编译器

#if defined(__GNUC__) && !defined(__llvm__) && !defined(__INTEL_COMPILER)
#define REAL_GCC __GNUC__ // probably
#endif

Clang 前端定义了 __clang__ ,但其他使用 LLVM 后端的前端也定义了 __llvm__ (例如,IBM XL C/C++ 版本 13.1.1 到 16.1)。最好只排除 __clang__而不是 __llvm__ ,取决于您要排除它的原因。 (例如,出于解析原因,而不是出于优化原因,例如 LLVM 在进行内联之前评估 __builtin_constant_p(),因此它对内联函数的参数毫无用处。)

另见 https://sourceforge.net/p/predef/wiki/Compilers/对于一个大列表。

https://blog.kowalczyk.info/article/j/guide-to-predefined-macros-in-c-compilers-gcc-clang-msvc-etc..html也出现在谷歌搜索结果中,但不太完整。

您应该提示的是 GCC 本身并没有定义您可以检测到的特定于 GCC 的宏,只有它支持的 GNU 方言 C 的版本。 ( GNU C 是一种语言,GCC 是该语言的编译器。不幸的是, GCC 的 __GNUC_MINOR__/ __GNUC_PATCHLEVEL__ 宏将两者混为一谈。)

Clang 定义 __GNUC__/ __GNUC_MINOR__/ __GNUC_PATCHLEVEL__根据它声称完全兼容的 gcc 版本。 (可能仅适用于 GCC 文档保证会起作用的东西,而不适用于碰巧与该版本或更高版本的 gcc 一起使用的东西。对于 GCC 本身,已记录 = 支持。
被编译器接受并不意味着它在 future 的 GCC 版本中得到支持和保证。这可能是 clang 证明支持某些 GNU C 版本的理由)。

例如,clang 7.0.1 将 GNUC/MINOR/PATCHLEVEL 定义为 4/2/1,即与 GCC 4.2.1 兼容

例如来自 the GCC manual
#define GCC_VERSION (__GNUC__ * 10000 \
+ __GNUC_MINOR__ * 100 \
+ __GNUC_PATCHLEVEL__)

/* Test for GCC > 3.2.0 */
#if GCC_VERSION > 30200

如果您正在测试最近 GCC 支持但最近 clang 还不支持的特定 GNU C 功能,那么您可能应该做类似的事情。

关于gcc - 如何告诉 Clang 停止伪装成其他编译器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38499462/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com