首页 > 编程语言 >C/C++ 宏区分不同系统、编译器、语言版本

C/C++ 宏区分不同系统、编译器、语言版本

时间:2024-02-19 16:34:22浏览次数:33  
标签:__ gcc cplusplus C++ 编译 编译器 版本

目录

区分不同系统

1)_WIN32,Windows系统
_WIN64:32bit and 64bit系统
M_WIN64:仅64bit Windows系统
M_WIN32:仅32bit Windows系统
_WINDOWS:GUI Application
_CONSOLE:console Application

2)__APPLE__,苹果系统,包括MAC、IOS

TARGET_IPHONE_SIMULATOR:IOS模拟器
TARGET_OS_IPHONE:IOS设备
TARGET_OS_MAC:MAC系统

3)__ANDRIOD__,安卓系统

4)__linux__,linux系统

5)__unix__,所有unix系统

6)_POSIX_VERSION,符合POSIX标准的系统
其他标准还有__FreeBSD__等.

区分不同编译器及其版本

1)MSVC:Microsoft Visual C++编译器
_MSC_VER:不同版本的MSVC编译器,对应不同的Visual Studio版本,如1928对应Visual Studio 2019

2)__GNUC__:GNU gcc编译器;
__GNUG__:GNU g++编译器

__GNUC____GNUC_MINOR____GNUC_PATCHLEVEL__:gcc主版本号、次版本号、修正版本号

__GNUC_PATCHLEVEL__是gcc 3.0以后才有

Linux下命令行输入$gcc -version,可确认gcc版本号。

Linux发行版gcc编译器通常写作GNU GCC

3)__clang__:clang编译器
__clang_major____clang_minor__:clang主、次版本号

LLVM是编译器的工具链集合,Clang是使用LLVM的编译器。

4)__MINGW32__:MinGW编译器

MinGW是Windows上gcc的一个实现,基于Win32 API构建,Unix/Linux程序很可能不能直接编译运行;
Cygwin是提供类Unix环境(cygwin1.dll),模拟POSIX API接口在Windows上运行,Unix/Linux程序可不修改或少量修改即可编译运行。

5)__CYGWIN__:Cygwin编译器
__CYGWIN32__:32bit版本Cygwin

6)__BORLANDC__:Borland C++编译器

区分不同语言及其版本

1)__cplusplus:区分C与C++代码

gcc编译.c文件,没定义__cplusplus,编译器按C编译代码;
gcc编译.cpp文件,定义了__cplusplus,编译器按C++编译代码;
g++编译.c文件,定义了 __cplusplus,编译器按C++编译代码;
g++编译.cpp文件,定义了 __cplusplus,编译器按C++编译代码;

如果当前文件已定义了__cplusplus(由编译器定义),说明编译环境为C++,则需要用extern "C"{...}包裹C代码,告诉编译器按C编译这部分代码。

tips:MSVC也支持__cplusplus

2)__cplusplus:确定当前支持的C++语言标准的版本
如__cplusplus常用值:199711L = C++98,201103L = C++11,201402L = C++14,201703L = C++17

参考

https://blog.csdn.net/goodcrony/article/details/104985620
https://blog.csdn.net/adminstate/article/details/130247630
https://zhuanlan.zhihu.com/p/78693248

标签:__,gcc,cplusplus,C++,编译,编译器,版本
From: https://www.cnblogs.com/fortunely/p/18021414

相关文章

  • VC++ 中 CT2A CA2T 两个宏进行字符串转换简单测试
    #include"afxwin.h"#include<iostream>usingnamespacestd;intmain(){CStringcs=_T("西游记");AfxMessageBox(_T("CString:")+cs);//CString转ACSIICT2Aa_str(cs);stringstd_str(a_str);......
  • KY78 最大上升子序列和C++
    这个解决问题的思路使用动态规划,即用已知状态去得到未知状态。思路逻辑是这样sum[i]记录以A[i]为末上升子序列的和的最大值然后从j从0-i-1遍历如果A[j]<A[i]那么sum[i]=sum[j]+A[i];然后找出sum[i]中的的最大值,就是以A[i]为末上升子序列的和的最大值。这样就实现了从前......
  • python多版本管理软件pyenv
     [安装]#installpyenvrequmentlibrariessudoaptupdate;sudoaptinstallbuild-essentiallibssl-devzlib1g-dev\libbz2-devlibreadline-devlibsqlite3-devcurl\libncursesw5-devxz-utilstk-devlibxml2-devlibxmlsec1-devlibffi-devliblzma-dev#i......
  • JimuReport积木报表 v1.7.0 变革版本发布,低代码报表设计工具
    项目介绍一款免费的数据可视化报表,含报表和大屏设计,像搭建积木一样在线设计报表!功能涵盖,数据报表、打印设计、图表报表、大屏设计等!Web版报表设计器,类似于excel操作风格,通过拖拽完成报表设计。秉承“简单、易用、专业”的产品理念,极大的降低报表开发难度、缩短开发周期、节......
  • 在 Visual Studio 2022 中创建一个类似于旧版本 Visual Studio 中的 Win32 Console Ap
    以下内容来自AI的回答,实测有效在VisualStudio2022中创建一个项目,其自动生成的源文件内容包含#include"stdafx.h"和使用_tmain作为入口点,意味着你需要创建一个基于Windows的传统控制台应用程序,这通常与旧版本的VisualStudio(如VisualStudio2005或更早)和使用预......
  • FUN GAME 一款普通的C++游戏
    凑合看吧,不是完整版。#include<bits/stdc++.h>#include<windows.h>#include<conio.h>usingnamespacestd;#defineptputs#definepfprintf#definepcputchar#definesfscanf#definegtgets#defineslSleepcharname[101];stack<int>gun;bo......
  • 禅道(一键安装包Linux版本)出现磁盘(/opt)空间不足的问题
    场景公司管理bug用到了禅道,但是为了方便我们就使用了禅道官网提供的一键安装包Linux版本。禅道官方下载地址:https://www.zentao.net/download.html 问题有一点美中不足的是禅道官方提供的一键安装版本(Linux)只能放在/opt文件夹下面。随着项目越来越多我们/opt容量达到100%了,接......
  • ECMAScript 语言规范每年都会进行一次更新,而备受期待的 ECMAScript 2024 将于 2024 年
    Promise.withResolvers使用Promise.withResolvers()关键的区别在于解决和拒绝函数现在与Promise本身处于同一作用域,而不是在执行器中被创建和一次性使用。这可能使得一些更高级的用例成为可能,例如在重复事件中重用它们,特别是在处理流和队列时。这通常也意味着相比在执行器内......
  • 15. C++类中成员变量的初始化总结
    C++类中成员变量的初始化总结1.普通的变量:一般不考虑啥效率的情况下可以在构造函数中进行赋值。考虑一下效率的可以再构造函数的初始化列表中进行。classCA{public:intdata;public:CA();};/*********/CA::CA():data(0)//……#1……初始化列表方式{......
  • Redis为何快?Redis6/7版本为何要开始支持多线程?
    Redis之所以快,主要有以下几个原因:1.数据结构和内部编码:Redis提供了多种数据结构,如string、hash、list、set、zset等,这些数据结构都有对应的内部编码。根据存储的键值对的个数和大小,Redis会选择最合适的内部编码。这样的设计可以充分发挥各种数据结构的优势,提高性能。2.纯内......