2010-09-06 73 views

回答

-2

这应该工作:

#include <iostream> 
int main(int argc, char ** arv){ 
    std::cout << "sizeof(void*)=" << sizeof(void*) << std::endl; 
    return 0; 
} 
+0

看到我的对HPT的回答发表评论。 – 2010-09-06 08:54:07

+4

另外,这不是C. – domen 2010-09-06 09:21:07

1

为“实现细节”这正是那种被冷落的C语言的正式规范的东西;考虑到编译器在理论上应该将它隐藏起来,在技术上你所能做的任何事情都是依赖于“未定义的非标准行为”。

这就是迂回的答案。实际的答案是,您可以使用sizeof(int)来确定您的特定架构上的寄存器宽度,并使用任何合理的编译器。

注意,这是在编译时确定,而不是运行时间,所以它会告诉你是否在32位或64位(或任何位)模式,而不是它是否是例如,您的应用程序是编译在模拟32位x86的64位机器上运行。对于这类信息,您需要查看完全特定于平台的内容,例如CPUID

+0

不要为此使用'sizeof(int)'。它(实际上)不会给你正确的答案。相反,'sizeof(size_t)','sizeof(ptrdiff_t)'或sizeof(char *)'是很好的选择。 (在任何健全的机器上,它们都将是相同的。) – 2010-09-06 12:21:21

+0

sizeof(char *)在具有不同指针大小的平台上不起作用(例如,实模式下的x86与near/far/huge指针无关)。 size_t可能会。哪些编译器具有不是寄存器宽度的“int”类型? – Crashworks 2010-09-07 00:17:27

0

编译器必须知道编译时它正在建设什么架构,所以应该没有必要确定该在运行

编译器通常会有一个预定义的宏指示体系结构;您将不得不测试您打算构建的所有体系结构。如果您只关心linux操作系统,那么您可以使用uname()调用。您可以将struct utsname传递给此API并获取详细信息。有关各种体系结构的宏的列表,请参阅http://predef.sourceforge.net/prearch.html

+0

那么,如果你在64位系统上运行32位程序呢? – atzz 2010-09-06 09:20:51

+1

就32位程序而言,它运行在32位系统上。它不能在自己的地址/进程空间内使用任何64位功能。我能想到的唯一原因可能是知道它是在32位还是在64位主机操作系统上,是决定下载和安装哪个版本的外部程序。 – 2010-09-06 12:23:28

+0

@atzz:程序会认为它在32位机器上运行,所以你设计的任何测试都会返回32位。该程序将在操作系统的32位子系统中运行,该子系统将成为虚拟机。 – Clifford 2010-09-06 16:54:10

0

这里有多层编译器 - 操作系统 - 处理器。 从用户C程序获取机器拱不是可取的,因为您没有足够的信息并且不具备便携性。

但是如果u想知道像Linux一样在这里特定的操作系统是link

可以使用上述工具的帮助下在你的程序。

0

您可以使用预处理:

#ifdef __i386__ 
    blahblah 
#elif __arm__ 
    blahblah 
#elif defined(__x86_64__) || defined(_M_AMD64) || defined (_M_X64) 
    blahblah 
#endif 
相关问题