我们的程序能否在编译时确定它在哪个编译器中编译? [复制]

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 中是不是有一个特殊的编译器变量,它在编译时标识配置?

Java反射机制

哪个 JIT 正在运行我的应用程序

能否向编译后得到的类中增加实例变量?能否向运行时创建的类中添加实例变量?为什么

g++: as 无法确定运行哪个汇编程序