编译器中和64位编程有关的预定义宏

本文对分别测试VC,MinGW,GCC 三种编译器,32位和64位模式,共6种情况下,和64位编程有关的与预定义宏的值。对跨平台编程具有参考意义。

 

Agner Fog 在他的《Calling conventions for different C++ compilers and operating systems》提到一些预订宏。这里摘录如下。

注:下面的内容来自《Calling conventions for different C++ compilers and operating systems》,Last updated 2012-02-29,作者:By Agner Fog. Copenhagen University College .如何原文内容不符,以原文为准。

 

Most C++ compilers have a predefined macro containing the version number of the
compiler. Programmers can use preprocessing directives to check for the existence of these
macros in order to detect which compiler the program is compiled on and thereby fix
problems with incompatible compilers.


Table 23. Compiler version predefined macros

 

Compiler

Predefined macro

Borland

__BORLANDC__

Codeplay VectorC

__VECTORC__

Digital Mars

__DMC__

Gnu

__GNUC__

Intel

__INTEL_COMPILER

Microsoft

_MSC_VER

Pathscale

__PATHSCALE__

Symantec

__SYMANTECC__

Watcom

__WATCOMC__

 


Unfortunately, not all compilers have well-documented macros telling which hardware
platform and operating system they are compiling for. The following macros may or may not
be defined:

Table 24. Hardware platform predefined macros

platform

Predefined macro

x86

_M_IX86

__INTEL__

__i386__

x86-64

_M_X64

__x86_64__

__amd64

IA64

__IA64__

 

 

DEC Alpha

__ALPHA__

 

 

Motorola Power PC

__POWERPC__

 

 

Any little endian

__LITTLE_ENDIAN__

 

 

Any big endian

__BIG_ENDIAN__

 

 

 

Table 25. Operating system predefined macros

Operating system

Predefined macro

DOS 16 bit

__MSDOS__

_MSDOS

 

 

Windows 16 bit

_WIN16

 

 

 

Windows 32 bit

_WIN32

__WINDOWS__

 

 

Windows 64 bit

_WIN64

_WIN32

 

 

Linux 32 bit

__unix__

__linux__

 

 

Linux 64 bit

__unix__

__linux__

__LP64__

__amd64

BSD

__unix__

__BSD__

__FREEBSD__

 

Mac OS

__APPLE__

__DARWIN__

__MACH__

 

OS/2

__OS2__

 

 

 

 

下面的代码主要测试和64编程有关的宏

void test()
{
	int len=sizeof(int)*8;
	printf("sizeof(int)=%d\n",len);

	len=sizeof(int *)*8;
	printf("sizeof(int*)=%d\n",len);

#ifdef _MSC_VER
	printf("_MSC_VER is defined\n");
#endif

#ifdef __GNUC__
	printf("__GNUC__ is defined\n");
#endif

#ifdef __INTEL__ 
	printf("__INTEL__  is defined\n");
#endif

#ifdef __i386__ 
	printf("__i386__  is defined\n");
#endif

#ifdef __x86_64__ 
	printf("__x86_64__  is defined\n");
#endif

#ifdef _WIN32 
	printf("_WIN32 is defined\n");
#endif

#ifdef _WIN64 
	printf("_WIN64 is defined\n");
#endif


#ifdef __linux__ 
	printf("__linux__ is defined\n");
#endif

#ifdef __LP64__ 
	printf("__LP64__ is defined\n");
#endif


#ifdef __amd64 
	printf("__amd64 is defined\n");
#endif
}

int main(int argc, char* argv[])
{
	test();
	return 0;
}


 

最后给出结果.

1. 在VC2010, 32位模式下编译,输出下面的信息
sizeof(int)=32
sizeof(int*)=32
_MSC_VER is defined
_WIN32 is defined

2. 在MinGW下编译 输出下面的信息
sizeof(int)=32
sizeof(int*)=32
__GNUC__ is defined
__i386__  is defined
_WIN32 is defined

3. 在64位Fedora19, 使用gcc -m32 编译,输出下面的信息
sizeof(int)=32
sizeof(int*)=32
__GNUC__ is defined
__i386__  is defined
__linux__ is defined

4. 在VC2010, 64位模式下编译,输出下面的信息
sizeof(int)=32
sizeof(int*)=64
_MSC_VER is defined
_WIN32 is defined
_WIN64 is defined

5. 在MinGW64下编译 输出下面的信息
sizeof(int)=32
sizeof(int*)=64
__GNUC__ is defined
__x86_64__  is defined
_WIN32 is defined
_WIN64 is defined
__amd64 is defined

6.  在64位Fedora19, 使用gcc -m64 编译,输出下面的信息
sizeof(int)=32
sizeof(int*)=64
__GNUC__ is defined
__x86_64__  is defined
__linux__ is defined
__LP64__ is defined
__amd64 is defined

注:在VC下直接用集成环境编译,在MinGW和Linux下直接使用 gcc来编译。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值