2010-09-06 76 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 
相關問題