`

C/C++ 中用哪个宏来区分32位与64位系统

 
阅读更多

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++复制字符串到剪粘板中

    C/C++复制字符串到剪粘板中 C/C++复制字符串到剪粘板中是指将字符串复制到剪粘板中,以便在其他应用程序中使用。这可以通过Win32 API和MFC来实现。 在Win32 API中,可以使用OpenClipboard、GetClipboardData、...

    Pro*C/C++ Precompiler Getting Started Release 8.1.6 for Window

    《Pro*C/C++预编译器入门指南 8.1.6 for Windows》是Oracle公司为开发者提供的一份关于在Windows环境下使用Pro*C/C++工具的起步教程。这份文档主要涵盖了如何利用C++语言与Oracle数据库进行交互的预编译技术,旨在...

    android studio项目java C/C++ 相互调用

    NDK是一组工具,允许开发者使用C和C++编写部分应用程序,这些代码可以与Java代码无缝集成。 1. **JNI(Java Native Interface)基础** JNI是Java平台的标准接口,用于在Java应用中调用本地(非Java)代码。它定义...

    C++ 得到系统特征码 CPU BIOS 硬盘 ID,64位,32位,亲测可用

    对于64位和32位系统的兼容性问题,C++程序可以通过预处理器宏来判断编译目标平台,例如`_WIN64`宏用于检测64位系统。在编写代码时,确保所有的API调用和类型定义都能在不同平台上正确工作。 在实际项目中,为了防止...

    嵌入式C/C++语言精华文章集锦

    ### 嵌入式C/C++语言精华文章集锦概览 #### 1. C/C++语言struct深层探索 在嵌入式系统编程中,`struct`是非常重要的数据组织工具,它允许程序员定义复杂的复合数据类型,从而更方便地管理和传递数据。在本章节中,...

    嵌入式C与C++语言精华文章集锦

    ### 嵌入式C与C++语言精华文章集锦 #### 1. C/C++语言struct深层探索 - **重要性与应用场景**:在嵌入式开发领域,特别是网络协议、通信控制以及嵌入式系统编程中,`struct`(结构体)是一种极其重要的数据类型。...

    嵌入式C/C++精华文章

    ### 嵌入式C/C++精华文章集锦 #### C/C++语言struct深层探索 在C/C++编程中,`struct`是一个重要的概念,它允许开发者定义复合数据类型,以便于组织和处理一系列相关数据。对于嵌入式系统开发来说,`struct`的灵活...

    PHP调用C/C++生成的.so库的详细笔记

    4. **定义ZEND_FUNCTION**:在C代码中,定义`ZEND_FUNCTION`宏来声明你的函数。这会为PHP解析器提供关于函数签名、参数类型和返回值的信息。 5. **注册函数到PHP**:在`init_module`函数中,使用`zend_function_...

    软件工程师笔试题(C/C++)

    软件工程师笔试题(C/C++) 本文档提供了一份软件工程师笔试题,涵盖了C/C++编程语言的多个方面,包括预处理器、宏、死循环、数据声明等。 1. 预处理器 预处理器(Preprocessor)是C/C++编译器的一部分,它的...

    C/C++兼容性程序设计必读

    为了确保C代码能够在C++环境中正确编译,可以通过使用`__cplusplus`宏来指定某些代码段以C方式编译和链接。这种处理方式主要用于解决C++编译器与C编译器之间可能存在的差异。 **典型写法示例**: ```cpp #ifdef __...

    c/c++Log日志类

    在C/C++编程中,日志记录是必不可少的工具,它可以帮助开发者跟踪程序运行状态,定位错误和性能问题。一个简单的C++日志类通常会包含以下关键功能: 1. **日志级别**:日志类应支持多种级别,如DEBUG、INFO、...

    C/C++ 宏详解(详解)

    C/C++ 宏是编程语言中的预处理器指令,它们允许程序员在编译阶段进行文本替换,从而实现代码的自动化生成。尽管宏有时被认为可能导致代码难以理解和维护,但在适当使用的情况下,它们可以极大地提高效率和代码复用。...

    c/c++宏定义 宏定义的入门教材 基础

    本文将详细介绍C/C++中的宏定义基础知识,包括宏的基本用法、常见陷阱以及如何正确地使用宏来提升程序质量。 #### 二、宏的基本概念 宏定义是通过预处理器(preprocessor)在编译之前进行替换操作的一种机制。宏...

    Pascal C C 语句对比(补充版).doc

    此外,在Pascal中,注释单行用//,而在C/C++中用/* */。在C/C++中,using namespace std;是打开命名空间的,可以不用关心,只要知道就行了。 二、数据类型及定义 在Pascal、C、C++中,常用的数据类型包括整型、...

    一份很不错的C/C++面试卷

    - `sizeof(p)` 返回的是指针本身的大小,在32位系统中通常为4。 - `sizeof(p) = 4` 3. **整型变量**: - `sizeof(n)` 返回的是整型变量的大小,通常为4。 - `sizeof(n) = 4` 4. **函数参数**: - `sizeof(str)`...

    C/C++ 内存泄露检测工具 memwatch2.69

    内存泄露是C/C++编程中常见的问题,尤其是在开发大规模、长时间运行的应用时,它可能导致系统资源耗尽,进而引发程序崩溃或系统性能下降。`memwatch`是一个实用的内存泄露检测工具,专为C/C++程序员设计,帮助找出...

    iphlpapi.h和lib32及64位

    在C++编程中,我们通常使用预处理器宏来区分不同的编译环境,例如`_WIN64` 或 `_M_X64` 来检测是否为64位系统,然后根据需要引入正确的库文件。当使用Visual Studio等IDE时,可以通过配置项目属性来指定不同平台的...

    c/C++可变参数函数的参数传递机制剖析

    ### C/C++可变参数函数的参数传递机制剖析 #### 摘要 本文深入探讨了C/C++语言中可变参数函数的参数传递机制,并提出了一种更加精确且灵活的设计方法来处理这类函数。通过分析,我们不仅理解了如何在函数内部访问...

    Java与C_C++异同

    ### Java与C/C++的主要异同点 #### 一、引言 随着计算机科学的发展,各种编程语言应运而生,其中Java、C和C++是最为广泛使用的三种语言之一。Java是由Sun Microsystems公司于1995年推出的一种完全面向对象的编程...

Global site tag (gtag.js) - Google Analytics