C判断操作系统、编译器类型、编译器版本及编译位数

1. 操作系统

c 复制代码
#ifdef __linux__
    // Linux 
#elif defined(_WIN32) || defined(_WIN64)
    // Windows 
#else
    // 其他 
#endif

2. 编译器类型及版本

c 复制代码
#ifdef __GNUC__
    // 使用了GCC编译器
    #if __GNUC__ >= 7
        // GCC版本大于等于7
    #else
        // GCC版本小于7
    #endif
#elif defined(_MSC_VER)
    // 使用了MSVC编译器
    #if _MSC_VER >= 1920
        // MSVC版本大于等于2019(版本号1920对应于MSVC 2019)
    #else
        // MSVC版本小于2019
    #endif
#else
    // 其他编译器
#endif
c 复制代码
//GCC编译器
#ifdef __GNUC__
#if __GNUC__ >= 3 // GCC3.0以上

//MSVC编译器
#ifdef _MSC_VER
#if _MSC_VER >=1000 // VC++4.0以上
#if _MSC_VER >=1100 // VC++5.0以上
#if _MSC_VER >=1200 // VC++6.0以上
#if _MSC_VER >=1300 // VC2003以上
#if _MSC_VER >=1400 // VC2005以上
#if _MSC_VER >=1500 // VC2008以上
#if _MSC_VER >=1600 // VC2010以上
#if _MSC_VER >=1700 // VC2012以上
#if _MSC_VER >=1800 // VC2013以上
#if _MSC_VER >=1900 // VC2015以上

//Borland C++
#ifdef __BORLANDC__

//Cygwin
#ifdef __CYGWIN__
#ifdef __CYGWIN32__

//mingw
#ifdef __MINGW32__

//windows
#ifdef _WIN32    //32bit
#ifdef _WIN64    //64bit
#ifdef _WINDOWS     //图形界面程序
#ifdef _CONSOLE     //控制台程序
//Windows(95/98/Me/NT/2000/XP/Vista)和Windows CE都定义了
#if (WINVER >= 0x030a)     // Windows 3.1以上
#if (WINVER >= 0x0400)     // Windows 95/NT4.0以上
#if (WINVER >= 0x0410)     // Windows 98以上
#if (WINVER >= 0x0500)     // Windows Me/2000以上
#if (WINVER >= 0x0501)     // Windows XP以上
#if (WINVER >= 0x0600)     // Windows Vista以上
//_WIN32_WINNT 内核版本
#if (_WIN32_WINNT >= 0x0500) // Windows 2000以上
#if (_WIN32_WINNT >= 0x0501) // Windows XP以上
#if (_WIN32_WINNT >= 0x0600) // Windows Vista以上

3. 编译位数

使用sizeof操作符来检测指针的大小。在64位编译中,指针的大小通常为8字节,而在32位编译中通常为4字节。

c 复制代码
if (sizeof(void*) == 8) {
    // 64位编译
} else {
    // 32位编译
}

参考链接:

相关推荐
论迹几秒前
【JavaEE】-- 多线程(初阶)2
java·开发语言·java-ee
+72011 分钟前
如何在java中用httpclient实现rpc post 请求
java·开发语言·rpc
学习两年半的Javaer19 分钟前
Rust语言基础知识详解【一】
开发语言·rust
PyAIGCMaster20 分钟前
50周学习go语言:第四周 函数与错误处理深度解析
开发语言·学习·golang
9毫米的幻想21 分钟前
【Linux系统】—— 冯诺依曼体系结构与操作系统初理解
linux·运维·服务器·c语言·c++
全栈开发圈21 分钟前
新书速览|Rust汽车电子开发实践
开发语言·rust·汽车
PyAIGCMaster23 分钟前
第二周补充:Go语言中&取地址符与fmt函数详解
开发语言·后端·golang
~kiss~28 分钟前
Rust学习~tokio简介
开发语言·学习·rust
Mr.Wang80941 分钟前
条款23:宁以non-member、non-friend替换member函数
开发语言·c++
关关钧1 小时前
【R语言】读取CSV数据时,显示[1] PK...<0 行> (或0-长度的row.names)
开发语言·r语言