Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
x64兼容C源_C_64 Bit_Portability_Itanium - Fatal编程技术网

x64兼容C源

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

我想我知道要在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 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