x64兼容C源
我想我知道要在msvc和gcc上兼容x86-32和x86-64需要使用什么样的ifdef,请参见下文。对于这些平台,这是否已完成x64兼容C源,c,64-bit,portability,itanium,C,64 Bit,Portability,Itanium,我想我知道要在msvc和gcc上兼容x86-32和x86-64需要使用什么样的ifdef,请参见下文。对于这些平台,这是否已完成 #if defined(_MSC_VER) # if defined(_M_IA64) || defined(_M_X64) # define SIZEOF_SIZE_T 8 # define SIZEOF_VOIDP 8 # elif defined(_M_IX86) # define SIZEOF_SIZE_T 4 # define
#if defined(_MSC_VER)
# if defined(_M_IA64) || defined(_M_X64)
# define SIZEOF_SIZE_T 8
# define SIZEOF_VOIDP 8
# elif defined(_M_IX86)
# define SIZEOF_SIZE_T 4
# define SIZEOF_VOIDP 4
# else
# error "Unsupported MSVC platform"
# endif
#elif defined(__GNUG__)
# if defined(__x86_64__) || defined(__ia64__)
# define SIZEOF_SIZE_T 8
# define SIZEOF_VOIDP 8
# elif defined(__i386__)
# define SIZEOF_SIZE_T 4
# define SIZEOF_VOIDP 4
# else
# error "Unsupported GCC platform"
# endif
#endif
从C程序员的角度来看,IA64和x86 64是否相同
我也希望能够在Macs上编译。我要补充什么
Edit:我不能使用sizeof(),因为我处理的是不可触及的遗留代码,这些代码使用了类似
#if sizeof\u VOIDP==sizeof\u LONG
。我也只对架构感兴趣,而不是实际内容。请注意,预编译器不允许#如果sizeof(size\u t)=sizeof(void*)
为什么不使用sizeof操作符
sizeof(long);
sizeof(int);
sizeof(void*);
所有这些对我来说都是相当多余的。只需使用
sizeof(void*)
和friends
如果需要定义常量,请按如下方式定义它们
#define SIZEOF_VOIDP sizeof(void*)
不,它不完整 只有
sizeof(char)
在所有平台、编译器选项,…所有其他类型不保证相同,在使用不同选项编译后保持不变 你需要
sizeof (short)
sizeof (int)
sizeof (long)
sizeof (long long) // C99
sizeof (float)
sizeof (double)
sizeof (long double) // C99
sizeof (void *)
sizeof (char *)
sizeof (long double *) // C99
...
当心!在Windows上,无论您是
i386
(即x86\u 32
)还是x86\u 64
,您都将拥有sizeof(long)==4
!(或定义长4的大小)。鉴于sizeof(void*)==8
sizeof(长)!=SIZEOF(Value*)/代码> < P> >关于<代码> >的定义:定义Syz of Fuffon 8 和<代码> >定义SoeVo.VoIDP 8 < /C> >p>
在HP-UX IA64上,此程序:
#include <iostream>
int main()
{
#if defined(__ia64__) && defined(__GNUG__)
std::cout << sizeof(long) << std::endl;
std::cout << sizeof(void*) << std::endl;
#endif
return 0;
}
给出:
8.
八,
但是如果像这样编译:
g++ -mlp64 main.cpp
g++ -milp32 main.cpp
给予
4.
4如果您正在做大量跨平台/跨编译器的工作,那么为这些常量添加静态断言可能是值得的,这样您至少可以捕获IFDEF中未设置的平台/编译器组合
C++中的P>> Boosiv:
#include <boost/static_assert.hpp>
BOOST_STATIC_ASSERT(sizeof(void*) == SIZEOF_VOIDP)
BOOST_STATIC_ASSERT(sizeof(long) == SIZEOF_LONG)
但我不确定这是不是最好的办法。在我的(32位)10.4 OSX上安装long和void*占用4个字节。如何使用构建系统将它们生成为常量
#include <stdio.h>
int main()
{
printf(
"#if !defined ARCH_MODEL_CONSTANTS_H\n"
"#define ARCH_MODEL_CONSTANTS_H\n"
"\n"
"# define SIZEOF_LONG %u\n"
"# define SIZEOF_VOIDP %u\n"
"\n"
"#endif\n",
(unsigned)sizeof(long),
(unsigned)sizeof(void *) ) ;
return 0 ;
}
#包括
int main()
{
printf(
“#如果!定义的拱门(模型)常数(H\n”
“#定义ARCH\u MODEL\u常量\u H\n”
“\n”
“#定义长%u的大小\n”
“#定义#u VOIDP%u的大小\n”
“\n”
“#endif\n”,
(未签名)sizeof(长),
(未签名)sizeof(void*);
返回0;
}
如果您的构建系统是一致的,其中所有内容都是使用相同的选项构建的,那么这将构建隐式可移植性,并且您可以处理ifdef
s中的问题,其中您在64位ia64和x64窗口上的sizeof(long)
错误(即使使用您假定为非窗口的gcc编译器)
用另一个答案中提到的静态断言来支持这一点,将为您提供两全其美的效果。//这可能有助于理解
//有了MSC或BORLAND,就可以做到这一点
#if(sizeof(int) == 4)
typedef int32 int;
#endif
#if(sizeof(int) == 8)
typedef int64 int;
#endif
GNU编译器不解析此#if(sizeof(int)==4)
他带着错误信息退出了 为什么要定义constans,例如sizeof(void*)
也是一个编译时常量?需要预编译时常量。在我介绍这两种体系结构的意义上完成。我还想添加Mac体系结构,无论是哪种。我不明白为什么您不能定义SIZEOF#LONG SIZEOF(LONG)
?预编译器不允许#if SIZEOF(whatever)=SIZEOF(other)。我需要遵守类似于#ifdef SIZEOF_LONG==SIZEOF_VOIDP的遗留代码…您可以定义这些宏,如#define SIZEOF_LONG(SIZEOF(LONG)),它们总是正确的。预编译器(至少msvc)不允许它们出现在#if语句中。只对体系结构感兴趣,不需要实际内容。这也适用于IA64吗?你知道从C程序员的角度来看,IA64和x64有什么不同吗?@Jonas:我不知道。我从来没有编程过,因为它可以访问IA64系统。关于ILP64、LP64和LLP64的更多信息:好主意-我甚至可以保留我的简约自制构建系统!嗯,你有什么类型的#define来识别你用的是哪种模式编译的吗?据我所知,\u LP64\u
和\u LP64
是在-mlp64
模式中定义的。
#if(sizeof(int) == 4)
typedef int32 int;
#endif
#if(sizeof(int) == 8)
typedef int64 int;
#endif