2013-06-18 51 views
5

我需要一個可以清除Linux和Windows中的屏幕的函數。要做到這一點,我想知道是否有一些說明可以告訴我我正在使用的操作系統。 我已經尋找解決方案,我發現下面的代碼:我如何知道我正在使用的操作系統?

void clear_screen() 
{ 
    #ifdef WINDOWS 

    std::system ("CLS"); 

    #else 

    // Assume POSIX 

    std::system("clear"); 

    #endif 
} 

有兩個問題與此功能:

  • 我不明白。

    - >對於#ifdef WINDOWS,WINDOWS的定義在哪裏?

  • 此代碼適用於Linux,但在Windows中不起作用。

注:

  • 我使用Windows XP。

  • 我不希望任何非標準功能......這樣的 「詛咒」

回答

7

您正在尋找

// Windows, all variants (including 64-bit and ARM) 
#ifdef _WIN32 

#ifdef __unix__ 

這些由您的編譯器定義,並不存儲在頭文件中。正因爲如此,你不需要#include文件第一,而這些#ifdef旨意總是給出正確的結果(除非你惹編譯)

+3

+1但你應該也可以解決第二部分的問題「這些被定義在哪裏」 – jozefg

+1

thx ...但是對任何Windows版本(XP,Vista,7,8)都是'_WIN32'32和64位! – BBeta

+2

@BBeta是的,它是。 –

2

WINDOWS由編譯器定義的,所以這個定義可以編譯 - 依賴性。這是有用的,以便根據您的操作系統編譯特定的代碼。

7

宏如_WIN32,__gnu_linux__,__linux__由有問題的編譯器定義。您可以找到預定義的編譯器宏here的完整列表。

_WIN32是爲Windows的32位和64位環境定義的。

1

有各種編譯器相關的宏。不幸的是,它們並不是特別有用,因爲它們不是標準化的,特定操作系統的C編譯器不一定會#定義它們。我也懷疑他們實際上違反了C標準C11 7.1.3。

100%可移植的解決方案,將在所有C編譯器上編譯,自己創建這樣一個常量。由於C是一種編譯語言,因此無論如何您必須針對每個操作系統編譯不同的代碼。只需添加一個名爲os.c的文件,在其中放置相關的#define或常量,然後將其鏈接到您的程序。編譯不同操作系統時需要更改的唯一東西是指向特定於操作系統的os.c的make文件路徑。

相關問題