LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 3689|回复: 6

请问gcc如何判断当前系统是32位还是64位,有没一个简单的宏定义

[复制链接]
发表于 2008-12-24 20:24:49 | 显示全部楼层 |阅读模式
如题,谢谢。
 楼主| 发表于 2008-12-24 20:31:40 | 显示全部楼层
主要是64位数的问题:
32位系统:long data_high,data_low;
64位系统:long long data;
能不能用一个ifdef让这个data变量在两种系统中都能用呢
回复 支持 反对

使用道具 举报

发表于 2008-12-24 21:16:35 | 显示全部楼层
使用 int64_t, uint64_t 这些不行吗?
回复 支持 反对

使用道具 举报

发表于 2008-12-24 21:25:48 | 显示全部楼层
#define IS_LINUX64() (sizeof(long)==8)

long long本来就可以在32位的gcc和系统下使用吧。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-12-24 23:41:19 | 显示全部楼层
多谢,看来没有特定的宏来对待这个问题,google上有个说是用sizeof(void *)来判断,应该的和 没本 说的是一个方法吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-12-29 08:52:00 | 显示全部楼层
以上的方法是不现实的!因为sizeof不能作为宏判断,只能作宏定义,具体说来是:
可用:
#define IS_LINUX64() (sizeof(long)==8)
却不能用:
#if sizeof(long)==8

要实现象
#ifdef __x86_64__
long tmp;
#else
long long tmp;
#endif
这样对变量定义是不行的

经过对include的翻查,最后确定gcc以__i386__来进行32位编码,而以__x86_64__来进行64位编码;64位的gentoo下stdio.h就是个简单例子(i不晓得其它的是不是?);而且在bits/wordsize.h中对这两个定义进行了综合,以__WORDSIZE的值来表示机器类型,大家可以直接去看看

整体看来,适当地翻翻include是必要的
回复 支持 反对

使用道具 举报

发表于 2009-1-2 02:52:01 | 显示全部楼层
明白你的意思了,你是要一个CC的Pre-defined Architecture Macros

AMD64

__amd64__
__amd64
__x86_64__
__x86_64

Defined by GNU C and Sun Studio

_M_X64 Defined by Visual Studio
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表