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

17 篇文章 3 订阅
13 篇文章 0 订阅

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值