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

     2023-02-22     7

关键词:

【中文标题】我们的程序能否在编译时确定它在哪个编译器中编译? [复制]【英文标题】: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)。 我不知道这一点,我会相应地编辑答案。

java编译时注解和运行时注解有啥区别

...是在运行时进行的。这个也常被称为运行时多态的体现。编译器是没有办法知道它调用的到底是那个方法,相反的,只有在jvm执行过程中,才知晓到底是父子类中的哪个方法被调用了当有如下一个接口的时候,我们是无法确定到... 查看详情

在eclipse中编译的android文件,如何指定它在哪个虚拟机上运行

我电脑上安装了多个虚拟机,运行一个Android软件时我选择了《下次启动时默认使用这个》,我现在想换个虚拟机来运行这个软件,我应该怎么修改呀,请大神指教右键工程名Runas...选择RunConfiguration,然后选择Target,进去后,下... 查看详情

java反射机制

Java让我们在识别对象和类的信息,主要有两种方式:一种是传统的RTTI,它假定我们在编译时已经知道了所有的类型信息;另一种是反射机制,它允许我们在运行时发现和使用类的信息。使用反射赋予了Java动态编译的能力,否则... 查看详情

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

...地方以64位运行时运行快速。我发现这可能与所使用的JIT编译器有关。有没有办法告诉我正在使用哪个JIT编译器来运行我的应用程序?我想看看它在服务器 查看详情

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

不能向编译后得到的类中增加实例变量!能向运行时创建的类中添加实例变量!因为编译后的类已经注册在runtime中,类结构体中的objc_ivar_list 实例变量的链表和instance_size实例变量的内存大小已经确定,同时runtime会调用class_s... 查看详情

编译器中的哪个程序负责预处理器? [关闭]

】编译器中的哪个程序负责预处理器?[关闭]【英文标题】:Whichprograminthecompilertakescareofthepreprocessors?[closed]【发布时间】:2018-08-2908:58:37【问题描述】:编译器是许多程序的组合。那么哪个程序在编译期间负责哪个部分?我在某... 查看详情

在 Abaqus 中运行连续作业时只编译一次用户子程序

】在Abaqus中运行连续作业时只编译一次用户子程序【英文标题】:CompileusersubroutineonlyoncewhenrunningconsecutivejobsinAbaqus【发布时间】:2016-06-2811:59:27【问题描述】:我有一个用Python编写的脚本,它根据上一个作业的输出来校准材料参... 查看详情

编译应用程序时UITextView无法输入[关闭]

】编译应用程序时UITextView无法输入[关闭]【英文标题】:UITextViewcannottypewhencompiletheapp[closed]【发布时间】:2014-05-1418:55:42【问题描述】:我的应用程序有一个奇怪的错误,我不知道出了什么问题。情况是我有一个UITextView,当我... 查看详情

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

...个项目已经在我的机器上运行了,但是这次出现了错误。编译器输出如下:fatalerror:as:unknownhostarchitecture(can\'tdeterminewhichassemblertor 查看详情

Webpack 不会在 Rails 应用程序中编译 Vue 文件

...ailsapplication【发布时间】:2018-08-2403:00:33【问题描述】:我们有一个Rails5项目,它在正常资产管道旁边运行webpack(通过webpackergem)。在过去的几个月里,一切都很顺利,直到昨天,由于某种原因,webpack停止编译我们的Vue文件。... 查看详情

在计算加速时使用编译器优化

】在计算加速时使用编译器优化【英文标题】:UsingCompilerOptimizationinCalculatingSpeed-up【发布时间】:2013-07-2013:06:32【问题描述】:当我们谈论在GPU上的Cuda中的并行程序比CPU上类似的顺序程序更快时,顺序程序是否应该由编译器优... 查看详情

如何mybatis中使用动态sql查询与注释

...:  静态SQL:静态SQL语句一般用于嵌入式SQL应用中,在程序运行前,SQL语句必须是确定的,例如SQL语句中涉及的列名和表名必须是存在的。静态SQL语句的编译是在应用程序运行前进行的,编译的结果会存储在数据库内部。而后... 查看详情

如何在 OS/X 的编译时确定编译标志?

】如何在OS/X的编译时确定编译标志?【英文标题】:HowtodeterminecompilationflagsatcompiletimeonOS/X?【发布时间】:2011-03-3123:12:31【问题描述】:如果我在带有gcc4.1的x86Linux上使用-fPIC进行编译,则定义__PIC__设置为1并且预处理器可以在编... 查看详情

编译器如何生成事件处理程序代码?

】编译器如何生成事件处理程序代码?【英文标题】:HowdoestheCompilergeneratetheEventhandlercode?【发布时间】:2009-08-2911:17:27【问题描述】:我在用户控件中添加了一个事件,我在用户控件的消费者窗口中调用了该事件,我的问题是... 查看详情

在 Eclipse 中配置 GCC 编译器时出错

】在Eclipse中配置GCC编译器时出错【英文标题】:ErrorwhenconfiguringGCCcompilerinEclipse【发布时间】:2015-05-1309:01:42【问题描述】:我们有自己的基于GCC的编译器。我们使用eclipse来使用我们的编译器开发.c文件——点击构建按钮后,ecli... 查看详情

idea编译调用的是哪个程序

参考技术A打开IDEA,依次点击File、New、Project,即可开始新建一个项目。首先点击左侧的Maven按钮,然后在ProjectSDK中下拉选择JDK版本,然后点击“Next”按钮。在Name输入项目名称,在Location位置输入项目路径,然后在GroupId中输入包... 查看详情

aop:选择正确的时机进行编织

...如下几个阶段:编译时:在对源代码进行编译时,特殊的编译器允许我们通过某种方式指定程序中各个方面进行Weave的规则,并根据这些规则生成编译完成的应用程序。编译后:根据Weave规则对已经完成编译的程序模块进行Weave操... 查看详情

内存分配有哪些策略

1、内存分配有哪些策略我们从编译原理讲起,不同的开发环境、开发语言都会有不同的策略。一般来说,程序运行时有三种内存分配策略:静态的、栈式的、堆式的静态存储是指在编译时就能够确定每个数据目标在运行时的存... 查看详情