【问题标题】:Can our program determine which compiler it is being compiled in, at compile time? [duplicate]我们的程序能否在编译时确定它在哪个编译器中编译? [复制]
【发布时间】:2018-12-16 11:02:53
【问题描述】:

存在多种用于 C 和 C++ 的编译器,其中一些用于为微控制器编译程序。有没有办法限制我们的程序只能在特定的编译器中编译?我猜想一定有办法使用预处理器指令来做到这一点。

【问题讨论】:

  • 您是否有兴趣确定特定的标准支持,或者特定的编译器制造商?这是后者的示例:coliru.stacked-crooked.com/a/1d77407c352fe882
  • 大多数编译器(或其预处理器)定义了它们独有的宏。例如,如果编译为 C,gnu 编译器定义 __GNUC__,如果编译为 C++,则定义 __GNUG__,这些宏扩展为与编译器版本号相关的值。要查找为特定编译器定义的宏以及它们扩展的内容,您需要阅读每个编译器的文档。
  • VS 有_MSC_VER,clang 有__clang__,有__APPLE__ 用于macOS,__x86_64____i386__ 用于GCC 的32 位和64 位英特尔处理器,__INTEL_COMPILER 用于icpc, _WIN32 适用于 Windows(我认为)...
  • @Peter:没有编译器可以确保它定义的宏对它们来说是唯一的。 Clang-902.0.39.2 将 __GNUC__ 定义为 4。

标签: c++ c compilation


【解决方案1】:

正如 Matthieu Brucher 在他的评论中所说,一些编译器供应商提供宏,您可以 ifdef 检查您是否在它们下编译。话虽如此,有一种(尽管丑陋的)方法可以限制您的 C++ 在特定编译器下编译。

假设你想让你的程序在clang下不编译,你可以这样做:

#ifdef __clang__
#error 
#endif

这样,如果您的代码是在 clang 下编译的 - 它根本无法编译,因为如果定义了 __clang__ 宏,则 ifdef 下的代码无法编译。

【讨论】:

  • 您可以使用#error 代替x=""。这将是一种干净的方式。
  • 编译器不需要不编译不符合标准的代码(C 2018 5.1.1.3 1 脚注 9),除非它包含 #error 由于条件包含而未跳过(C 2018 4 4)。
  • 我不知道这一点,我会相应地编辑答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-10
  • 2013-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多