To: debian-chinese-gb@lists.debian.org
Subject: Re: C/C++ 中用哪个宏来区分32位与64位系统?
From: Dongsheng Song <dongsheng.song@gmail.com>
Date: Fri, 27 Apr 2012 12:13:10 +0200
Message-id: <CAE8XmWp9FUav=th5UYxJK0itocKtyabmnapPSQ6=JvKQHPkGpw@mail.gmail.com>
In-reply-to: <20120426234014.GA2646@localhost.localdomain>
References: <20120426234014.GA2646@localhost.localdomain>
2012/4/27 Plain_Text <resation@gmail.com>
>
>
>
> 从 C/C++ 程序员的角度来看,32位系统与64位系统的本质区别是什么?注意
> 这里说的是广义的32位和64位,而不特定指 i386, amd64. 是否是指针长度不一样?
> 我现在这样区分两者:
>
> #if __SIZEOF_POINTER__ == 4
> /* 32位系统 */
> #elif __SIZEOF_POINTER__ == 8
> /* 64位系统 */
> #endif
>
> 这是 GCC 下的标准的做法吗?
要回答这个问题,首先你要弄清楚,你为什么要判断系统的类型?是想要针对64位
地址做优化呢,还是仅仅想使用64位数据类型?
现在已经有32,64,128位数据类型的自然支持,地址寄存器只有32位和64位这2种.
如果你需要区分32位地址和64位地址,那么就使用判断指针长度的做法,例如使用
__SIZEOF_POINTER__ 或 sizeof(void*) 或 __LP64__/__ILP32__ .
如果你只关心数据类型,可以判断 __SIZEOF_INT__ 或 __SIZEOF_LONG__ 或
__SIZEOF_LONG_LONG__ 或 __SIZEOF_SIZE_T__ 或 __SIZEOF_INT128__ 。
最简单的办法是,你可以直接使用 stdint.h 中定义的 [u]int(8|16|32|64)_t 数据类型.
> 另外顺便问一下,在 Windows 下的 MSVC 里,
> 该用什么宏来区分两者? Windows 似乎只支持i386, amd64, 应该容易应付。不过
> 最新的 Windows 8 好像也开始支持 MIPS 系统。
MSVC 比较简单,在 64 bit 系统中定义了 _WIN64,只要没有定义 _WIN64,就是 32 bit
系统. 对于 64 位的 x86 机器,定义了 _M_AMD64 (或者中立的名字 _M_X64). 对于
32 位的 x86 机器,定义了 _M_IX86 . MSVC 11 的测试版本我没有安装,因此不知道
MIPS 的预定义宏,你可以自己装装看看.
注意判断的时候要使用"不是64就视为32的逻辑",而不要使用"不是32就视为64的逻辑".
#if defined(_AMD64_)
/* 64位系统 */
printf("64\n");
#else
/* 32位系统 */
printf("32\n");
#endif
[转]
http://lists.debian.org/debian-chinese-gb/2012/04/msg00024.html
分享到:
相关推荐
#### C/C++ 在嵌入式系统中的重要性 在嵌入式领域,C/C++是非常重要的编程语言,它们因其高效的资源利用能力和接近硬件的操作能力而备受青睐。对于希望在这个领域有所建树的开发者而言,掌握这些语言的关键技术和...
C/C++复制字符串到剪粘板中 C/C++复制字符串到剪粘板中是指将字符串复制到剪粘板中,以便在其他应用程序中使用。这可以通过Win32 API和MFC来实现。 在Win32 API中,可以使用OpenClipboard、GetClipboardData、...
《Pro*C/C++预编译器入门指南 8.1.6 for Windows》是Oracle公司为开发者提供的一份关于在Windows环境下使用Pro*C/C++工具的起步教程。这份文档主要涵盖了如何利用C++语言与Oracle数据库进行交互的预编译技术,旨在...
NDK是一组工具,允许开发者使用C和C++编写部分应用程序,这些代码可以与Java代码无缝集成。 1. **JNI(Java Native Interface)基础** JNI是Java平台的标准接口,用于在Java应用中调用本地(非Java)代码。它定义...
对于64位和32位系统的兼容性问题,C++程序可以通过预处理器宏来判断编译目标平台,例如`_WIN64`宏用于检测64位系统。在编写代码时,确保所有的API调用和类型定义都能在不同平台上正确工作。 在实际项目中,为了防止...
### 嵌入式C/C++语言精华文章集锦概览 #### 1. C/C++语言struct深层探索 在嵌入式系统编程中,`struct`是非常重要的数据组织工具,它允许程序员定义复杂的复合数据类型,从而更方便地管理和传递数据。在本章节中,...
4. **定义ZEND_FUNCTION**:在C代码中,定义`ZEND_FUNCTION`宏来声明你的函数。这会为PHP解析器提供关于函数签名、参数类型和返回值的信息。 5. **注册函数到PHP**:在`init_module`函数中,使用`zend_function_...
软件工程师笔试题(C/C++) 本文档提供了一份软件工程师笔试题,涵盖了C/C++编程语言的多个方面,包括预处理器、宏、死循环、数据声明等。 1. 预处理器 预处理器(Preprocessor)是C/C++编译器的一部分,它的...
为了确保C代码能够在C++环境中正确编译,可以通过使用`__cplusplus`宏来指定某些代码段以C方式编译和链接。这种处理方式主要用于解决C++编译器与C编译器之间可能存在的差异。 **典型写法示例**: ```cpp #ifdef __...
在C/C++编程中,日志记录是必不可少的工具,它可以帮助开发者跟踪程序运行状态,定位错误和性能问题。一个简单的C++日志类通常会包含以下关键功能: 1. **日志级别**:日志类应支持多种级别,如DEBUG、INFO、...
C/C++ 宏是编程语言中的预处理器指令,它们允许程序员在编译阶段进行文本替换,从而实现代码的自动化生成。尽管宏有时被认为可能导致代码难以理解和维护,但在适当使用的情况下,它们可以极大地提高效率和代码复用。...
本文将详细介绍C/C++中的宏定义基础知识,包括宏的基本用法、常见陷阱以及如何正确地使用宏来提升程序质量。 #### 二、宏的基本概念 宏定义是通过预处理器(preprocessor)在编译之前进行替换操作的一种机制。宏...
此外,在Pascal中,注释单行用//,而在C/C++中用/* */。在C/C++中,using namespace std;是打开命名空间的,可以不用关心,只要知道就行了。 二、数据类型及定义 在Pascal、C、C++中,常用的数据类型包括整型、...
- `sizeof(p)` 返回的是指针本身的大小,在32位系统中通常为4。 - `sizeof(p) = 4` 3. **整型变量**: - `sizeof(n)` 返回的是整型变量的大小,通常为4。 - `sizeof(n) = 4` 4. **函数参数**: - `sizeof(str)`...
内存泄露是C/C++编程中常见的问题,尤其是在开发大规模、长时间运行的应用时,它可能导致系统资源耗尽,进而引发程序崩溃或系统性能下降。`memwatch`是一个实用的内存泄露检测工具,专为C/C++程序员设计,帮助找出...
在C++编程中,我们通常使用预处理器宏来区分不同的编译环境,例如`_WIN64` 或 `_M_X64` 来检测是否为64位系统,然后根据需要引入正确的库文件。当使用Visual Studio等IDE时,可以通过配置项目属性来指定不同平台的...
### C/C++可变参数函数的参数传递机制剖析 #### 摘要 本文深入探讨了C/C++语言中可变参数函数的参数传递机制,并提出了一种更加精确且灵活的设计方法来处理这类函数。通过分析,我们不仅理解了如何在函数内部访问...
### Java与C/C++的主要异同点 #### 一、引言 随着计算机科学的发展,各种编程语言应运而生,其中Java、C和C++是最为广泛使用的三种语言之一。Java是由Sun Microsystems公司于1995年推出的一种完全面向对象的编程...