您的位置:首页 > 编程语言 > C语言/C++

C++获取系统和程序的位数

2017-10-24 15:13 148 查看

1. 概述

如今 64 位系统越来越流行了 , 对于软件开发人员来说 , 掌握 64 位开发技术将会有更好的发展空间 ; 而且经过这几年的发展 , 64 位开发工具也成熟了 , 例如 Visual Studio 2010 等后续版本 ;

关于如何配置64位平台 , MSDN上有详细的介绍 : http://msdn.microsoft.com/zh-cn/library/9yb4317s.aspx

在很多时候 , 我们希望能兼容老系统 , 于是配置了两个编译平台 Win32 和 x64 ;

但光这样做还是不够的 , 因为老系统不支持某些新功能 ; 所以我们需要在运行时动态动态判断 ;

最常见的判断有两种 :

判断程序位数 : 当前程序被编译到了哪个平台 ;

判操作系统位数 : 当前程序是运行在 32 位的操作系统上 , 还是 64 位的操作系统 ;

对于第一种判断程序位数 , 虽然也可以通过配置预处理符号 , 做编译时判定 ; 但该方法稍微有点繁琐 , 而且在有些情况下不太适合 , 例如我想获得程序位数字符串 , 就必须用
#if
等语句写多行代码 ;

对于第二种判操作系统位数 , 那就只有在运行时判断了 ;

2. 代码实例

#include "stdafx.h"
#include <Windows.h>
#include <stdio.h>
#include <tchar.h>
#include <conio.h>

// 获取程序位数 (被编译为多少位的代码)
int GetProgramBits()
{
return sizeof(int*) * 8;
}

// 获取系统信息
void SafeGetNativeSystemInfo(__out LPSYSTEM_INFO lpSystemInfo)
{
if (NULL == lpSystemInfo)
{
return;
}
typedef VOID (WINAPI *FuncGetSystemInfo)(LPSYSTEM_INFO lpSystemInfo);
FuncGetSystemInfo funcGetNativeSystemInfo = (FuncGetSystemInfo)GetProcAddress(GetModuleHandle(_T("kernel32")), "GetNativeSystemInfo");
// 优先使用 "GetNativeSystemInfo" 函数来获取系统信息
// 函数 "GetSystemInfo" 存在系统位数兼容性问题
if (NULL != funcGetNativeSystemInfo)
{
funcGetNativeSystemInfo(lpSystemInfo);
}
else
{
GetSystemInfo(lpSystemInfo);
}
}

// 获取操作系统位数
int GetSystemBits()
{
SYSTEM_INFO si;
SafeGetNativeSystemInfo(&si);
if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64 ||
si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64 )
{
return 64;
}
return 32;
}

int _tmain(int argc, _TCHAR* argv[])
{
const int nBitCode = GetProgramBits();
const int nBitSys = GetSystemBits();
_tprintf(_T("I am a %d bit Program, run on %d bit System..."), nBitCode, nBitSys);
_getch();
return 0;
}


作者 Github : tojohnonly , 博客 : EnskDeCode
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ 64位 软件开发