我们的程序能否在编译时确定它在哪个编译器中编译? [复制]
Posted
技术标签:
【中文标题】我们的程序能否在编译时确定它在哪个编译器中编译? [复制]【英文标题】: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。
【参考方案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)。
我不知道这一点,我会相应地编辑答案。以上是关于我们的程序能否在编译时确定它在哪个编译器中编译? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
在eclipse中编译的Android文件,如何指定它在哪个虚拟机上运行
iOS SDK 中是不是有一个特殊的编译器变量,它在编译时标识配置?