2015-12-08 84 views
5

有什麼方法可以使用C/C++代碼自動檢測操作系統嗎?我需要這個爲Linux,Windows甚至是Raspberry Pi運行一些跨平臺的代碼。我試圖自動檢測操作系統,這樣我就不會陷入必須要求將機器上運行的操作系統作爲輸入的情況。在C/C++中自動檢測操作系統

我在考慮像驗證文件系統結構或類似的東西,我不知道我是否在做某件事。

+0

這個答案真的取決於你想要達到的差異。通常情況下,正確的做法是使用預定義的宏,比如Jeegar Patel說的,但是在構建系統中檢測這個並且選擇正確的編譯器等常常也是有用的。 –

+1

在POSIX系統上,如果你是本地構建的沒有交叉編譯),你可以在構建命令中使用'uname' –

+2

你想要一個二進制文件,它可以在多個不同的操作系統上奇蹟般地執行,然後在運行時檢測它正在運行的二進制文件嗎?沒門。我覺得C++可能是你的問題的錯誤解決方案,不管可能如何。 –

回答

6

我用下面的代碼在過去的Linux和Windows

#include<stdio.h> 

int main(int argc, char *argv[]) 
{ 

#ifdef _WIN32 
    printf("in Windows"); 
#endif 

#ifdef linux 
    printf("In Linux"); 
#endif 

    return 0; 
} 

一般,所以你需要使用這些宏來檢測它的操作系統是這一切的工具鏈都有自己的預定義宏之間的檢查。

此類預定義宏的列表。

http://sourceforge.net/p/predef/wiki/OperatingSystems/


是作爲一個側面說明,這裏OS的檢測是使用編譯時宏發生了。所以根據工具鏈各自的宏定義將進入構建。

運行檢測操作系統的版本,就像在Java中,我們做C/C

System.getProperty("os.name") 

原路++我們沒有任何API。


在POSIX系統中使用 'uname' 我們可以得到操作系統名稱。

+0

這不是OP所要求的自動檢測,這是有條件的構建。 –

+0

@GeorgeAndré區別在哪裏? – fuz

+1

@FUZxxl這裏我們在編譯時檢測os,不是運行時。 –

4

有這個方便的列表(保存到磁盤!)。列表predefined compiler macros

我還建議,如果你的目標是多個平臺,找一個已經可用的庫。

+1

中沒有這樣的API,[Qt](http://qt.io/)和[POCO](http:// pocoproject。org /)是值得研究的跨平臺C++庫。 –