Linux下使用宏定义判断系统架构和系统类型

文章目录

  • 查看编译器当前支持的宏定义
  • 查找指定的宏
    • 不同架构
    • 不同系统
  • 附录-编译器内部常用的一些宏定义
  • 宏定义实际应用
    • 使用宏定义判断系统架构
    • 使用宏定义判断系统类型

一般情况下在linux下做C/C++方面的开发不需要太关注系统架构,当然如果涉及到不同架构下的适配问题,就需要额外处理了。最近开发中遇到了需要在不同的系统架构下分情况处理,由于没有这方面的经验,自己去找了相关的资料,汇总整理了一些内容分享给有需要的小伙伴。

查看编译器当前支持的宏定义

在linux下使用如下命令gcc -E -dM - < /dev/null可以查看当前编译器内部所有默认的宏定义:
在这里插入图片描述

查找指定的宏

不同架构

如查找编译器是否支持x86架构相关的宏定义:
gcc -E -dM - < /dev/null| grep x86
在这里插入图片描述
查找32位arm相关的宏定义
gcc -E -dM - < /dev/null| grep __arm__
查找64位arm相关的宏定义
gcc -E -dM - < /dev/null| grep __aarch64__

不同系统

windows系统的宏定义为 _WIN32
linux系统的宏定义为 __linux__
mac系统的宏定义为 __APPLE__

附录-编译器内部常用的一些宏定义

通常,在构建时使用 #ifdef xxx最为方便:

对于 32 位 ARM平台,使用 arm
对于 64 位 ARM平台,使用 aarch64
对于 32 位 x86平台,使用 i386
对于 64 位 x86平台,使用 x86_64
请注意:32 位 X86 称为 __i386__,而不是__x86__

宏定义实际应用

使用宏定义判断系统架构

#if (defined __arm__) || (defined __aarch64__) // arm平台cout << "arm platform..." << endl;
#elif (defined __i386__) || (defined __x86_64__) // x86平台cout << "x86 platform..." << endl;
#elif defined __APPLE__  // mac平台cout << "mac platform..." << endl;
#endif

在x86平台运行结果如下:
在这里插入图片描述

使用宏定义判断系统类型

判断是否为Linux系统,可以使用__linux、__linux__、__gnu_linux__、linux宏定义,具体有哪些宏可以自行查看自己的编译器支持的宏。
使用gcc -E -dM - < /dev/null| grep linux命令可以查询:
在这里插入图片描述

#ifdef _WIN32cout << "windows..." << endl;
#elif defined __linux__cout << "linux..." << endl;
#endif

在64位linux系统上输出:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/156531.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软考小记-软件工程

模块的控制范围包括模块本身及其所有的从属模块。模块的作用范围是指模块一个判定的作用范围&#xff0c;凡是受这个判定影响的所有模块都属于这个判定的作用范围.&#xff0c;原则上一个模块的作用范围应该在其控制范围之内&#xff0c;若没有&#xff0c;则可以将判定所在模块…

安装向量数据库milvus及其Attu

前置条件安装docker compose 在宿主机上创建文件目录 mkdir -p /home/sunyuhua/milvus/db mkdir -p /home/sunyuhua/milvus/conf mkdir -p /home/sunyuhua/milvus/etcd下载docker-compose.yml wget https://github.com/milvus-io/milvus/releases/download/v2.2.11/milvus-s…

OpenGL_Learn14(光照贴图)

1. 漫反射贴图 在光照场景中&#xff0c;它通常叫做一个漫反射贴图(Diffuse Map)&#xff08;3D艺术家通常都这么叫它&#xff09;&#xff0c;它是一个表现了物体所有的漫反射颜色的纹理图像。 我们会将纹理储存为Material结构体中的一个sampler2D 。我们将之前定义的vec3漫反…

AI技术实力认证,宏电股份荣获2023年度AI天马“领军企业”

近日&#xff0c;由中国新一代人工智能发展战略研究院指导&#xff0c;深圳市人工智能产业协会主办&#xff0c;广东未来产业研究院承办的2023年度“AI天马”认定最终结果公布&#xff0c;宏电股份荣获AI天马“领军企业”奖项。 宏电股份基于20余年的技术沉淀&#xff0c;在工业…

基于猎食者算法优化概率神经网络PNN的分类预测 - 附代码

基于猎食者算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于猎食者算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于猎食者优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神经网络…

关于lenra你需要了解的

monorepo&#xff1a;项目代码管理方式&#xff0c;单个仓库中管理多个项目是一种设计思想 lenra&#xff1a;是一种工具&#xff0c;对于使用npm和git管理多软件包代码仓库的工作流程进行优化 使用这些工具的优点&#xff1a; 公共依赖只要安装一次&#xff0c;Monorepo 中…

数字化转型导师坚鹏:数字化时代银行网点厅堂营销5大关键点分析

数字化时代银行网点厅堂营销需要抓住以下5大关键点&#xff1a; 1、精准识别客户&#xff1a;在数字化时代&#xff0c;银行网点厅堂营销的关键在于精准识别客户。通过利用大数据和人工智能技术&#xff0c;银行可以分析客户的行为和需求&#xff0c;从而更好地了解客户&#…

面试题:你怎么理解System.out.println() ?

文章目录 首先分析System源码out源码分析println分析拓展知识点 你如何理解System.out.println() ? 学了这么久的面向对象编程&#xff0c;那如何用一行代码体现呢&#xff1f; 如果你能自己读懂System.out.println()&#xff0c;就真正了解了Java面向对象编程的含义 面向对…

如何理解低代码开发工具?

目录 一、低代码平台是什么 1. 数据输入 2. 数据流转 3. 数据加工 4. 数据输出 &#xff08;1&#xff09;视图&#xff1a;单表的数据的简单展示 &#xff08;2&#xff09;看板&#xff1a;提供单表、多表数据的多种图表组合展示 二、低代码能力 ➪ 全栈可视化编程&#xff1…

大彻大悟,期末的大学生请码住!!

不装了&#xff0c;我摊牌了&#xff0c;这东西大学生太太太需要了啊&#xff01; 就是这个 写作火火&#xff0c;只需要输入需求&#xff0c;一键生成&#xff0c;几秒就给我写出来一篇&#xff0c;不满意还可以重新写&#xff0c;关键每次内容都不一样&#xff0c;完全不怕…

Redis常用的八种场景

作为一名 Java后端人员&#xff0c;对 Redis肯定并不陌生&#xff0c;Redis作为一种内存数据库&#xff0c;以其速度之快在编程的舞台上纵横多年&#xff0c;那么&#xff0c;Redis到底适合哪些业务场景&#xff1f;今天就来聊一聊。 1. 缓存/数据库 缓存&#xff08;Cache&am…

电压放大器实验可以研究哪些领域

电压放大器是一种电子电路&#xff0c;能够对输入信号进行放大&#xff0c;使得输出信号具有更大的幅度。在实验中&#xff0c;电压放大器可以应用于许多领域&#xff0c;从电子学到通信领域&#xff0c;都能够进行研究与实践。 在电子学领域&#xff0c;电压放大器实验可以用于…

算法---腐烂的橘子

题目 在给定的 m x n 网格 grid 中&#xff0c;每个单元格可以有以下三个值之一&#xff1a; 值 0 代表空单元格&#xff1b; 值 1 代表新鲜橘子&#xff1b; 值 2 代表腐烂的橘子。 每分钟&#xff0c;腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。 返回 直到单元格…

STM32在进行CAN总线多节点通信时,同时发数据会一直收不到某设备数据的问题及解决

CAN多设备通信收不到某设备数据的问题及解决 遇到的问题问题的发现CAN总线的一般冲突机制STM32中的CAN冲突机制 遇到的问题 问题的发现 最近在开发Canopen项目中&#xff0c;进行一主多从设备通信时&#xff0c;主站发送同步帧&#xff0c;两个从站往往只有帧ID优先级高的设备…

【C++进阶之路】第四篇:set和map

文章目录 一、关联式容器健值对二、set & multiset三、map & multimap在这里插入图片描述 四、set和map底层原理 一、关联式容器健值对 关联式容器 & 键值对 二、set & multiset set & multiset 三、map & multimap map & multimap 四、set和…

SocketIo的使用和基于SocketIO的聊天室

Socket.IO 是一个库&#xff0c;可以在客户端和服务器之间实现 低延迟, 双向 和 基于事件的 通信。 一、Socket.IO的特点 以下是 Socket.IO 在普通 WebSockets 上提供的功能&#xff1a; 1、HTTP 长轮询回退 如果无法建立 WebSocket 连接&#xff0c;连接将回退到 HTTP 长轮…

Cesium 加载geojson数据类型点线面

1.获取geojson数据&#xff0c;本地新建一个.ts文件放置数据导出&#xff0c;并引入 获取geojson数据&#xff1a; DataV.GeoAtlas地理小工具系列 import { scGeojson } from ./geojson; 2.加载面 const addPolygonEvt () > {viewer.dataSources.add(Cesium.GeoJsonDataSo…

【计算机网络学习之路】Windows下的socket编程

文章目录 前言Windows下的socket编程1.预备工作2. socket编程 结束语 前言 本系列文章是计算机网络学习的笔记&#xff0c;欢迎大佬们阅读&#xff0c;纠错&#xff0c;分享相关知识。希望可以与你共同进步。 本篇文章仅记录Windows下socket编程和Linux的不同&#xff0c;并没…

云ES容灾方案

一、ES集群可用性容灾 1.1 云ES集群可用性容灾(使用跨可用区实例) 云ES集群部署在三个可用区,单可用区故障,云ES集群依然可能对外提供服务;两个可用区故障,需要进行控制台切流(集群会自动切的选择主节点) 应用服务部署在二个可用区,单可用区故障,依然可对提供服务1.2 …