6

我想用C++編寫一個包含系統調用的跨平臺函數。我可以檢查哪些條件編譯標誌以確定代碼正在編譯哪個操作系統?我主要對Windows和Linux感興趣,使用Visual Studio和GCC。基於操作系統的C++中的條件編譯

我認爲它應該是這個樣子:

void SomeClass::SomeFunction() 
{ 
    // Other code 

#ifdef LINUX 
    LinuxSystemCall(); 
#endif 

#ifdef WINDOWS 
    WindowsSystemCall(); 
#endif 

    // Other code 
} 

回答

7

我的海灣合作委員會(4.3.3)定義了以下與Linux相關的預定義宏:

$ gcc -dM -E - < /dev/null | grep -i linux 
#define __linux 1 
#define __linux__ 1 
#define __gnu_linux__ 1 
#define linux 1 

在VC++(和許多其他的Win32編譯器),還有幾個預定義的宏來標識平臺,最顯着的是_WIN32。進一步的細節:http://msdn.microsoft.com/en-us/library/b0084kay(VS.80).aspx

+3

有在Win32/Win64的條件編譯處理時的疑難雜症 - 編譯爲Win64的時候你會發現,_WIN32定義這樣的測試對_WIN64你測試前(!)對於_WIN32 – 2009-05-24 23:13:01

7

沒有標準的方法來做到這一點。可以鍵入每個平臺定義的特定宏。例如,_WIN32將在Windows上定義,幾乎肯定不是Linux。但是我不知道任何相應的Linux宏。

由於您使用的是單獨的編譯器,因此您有獨立的構建環境。爲什麼不自己添加宏? Visual Studio和GCC都支持從命令行定義宏,因此只需定義它們即可。

+0

我想使用最常見的宏,希望編譯器自己定義的默認值。看來_WIN32和linux就足以達到我的目的。 – 2009-05-25 00:03:07

5

我總是嘗試做這種方式實現了平臺的細節出了主代碼的

platform.h:

#if BUILD_PLATFORM == WINDOWS_BUILD 
#include "windows_platform.h" 
#elif BUILD_PLATFORM == LINUX_BUILD 
#include "linux_platform.h" 
#else 
#error UNSUPPORTED PLATFORM 
#endif 

someclass.c:

void SomeClass::SomeFunction() 
{ 
    system_related_type t; 
    // Other code 
    platform_SystemCall(&t); 
    // Other code 
} 

現在windows_platform.hlinux_platform.h您將typedef system_related_type設置爲本機類型,並將#define platform_SystemCall作爲本機調用,或創建小包裝函數,如果從一個平臺設置到另一個平臺的參數太不同。

如果某個特定任務的系統API在各個平臺之間差異很大,則可能需要創建自己的版本API來區分差異。但大多數情況下,Windows和Linux上的各種API之間有相當直接的映射關係。

與其依靠某些特定的編譯器#define來選擇平臺,我在項目文件或makefile中定義BUILD_PLATFORM,因爲無論如何,這些必須是平臺唯一的。

0

這是我使用的。它的工作原理的Visual Studio 2008下,和MinGW:

#ifdef __GNUC__ 
    #define LINUX 
#else 
    #define WINDOWS 
#endif 

#ifdef WINDOWS 
    #include "stdafx.h" 
#else 
    #include <stdlib.h> 
    #include <string.h> 
    #include <stdio.h> 
    #include <ctype.h> 
    #include <assert.h> 
    #include <malloc.h> 
#endif 
相關問題