2013-06-18 50 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文件路径。

相关问题