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。

  • 我不想要任何非标准的功能......这样的“诅咒”

4

4 回答 4

7

诸如_WIN32, __gnu_linux__,之类的宏__linux__由相关编译器定义。您可以在此处找到预定义编译器宏的完整列表。

_WIN32为 Windows 的 32 位和 64 位环境定义。

于 2013-06-18T12:40:52.237 回答
6

您正在寻找

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

或者

#ifdef __unix__

这些是由您的编译器定义的,并且不存储在头文件中。因此,您不需要先#include创建文件,并且这些#ifdefs 将始终给出正确的结果(除非您弄乱了编译器)

于 2013-06-18T12:18:39.777 回答
2

WINDOWS由您的编译器定义,因此该定义可以依赖于编译器。根据您的操作系统编译特定代码很有用。

于 2013-06-18T12:21:50.507 回答
1

有各种编译器相关的宏。不幸的是,它们并不是特别有用,因为它们不是标准化的,并且特定操作系统的 C 编译器不一定#define 它们。我还怀疑它们实际上违反了 C 标准 C11 7.1.3。

将在所有 C 编译器上编译的 100% 可移植解决方案是自己创建这样一个常量。由于 C 是一种编译语言,因此无论如何您都必须为每个操作系统以不同的方式编译代码。os.c只需在您放置相关或常量的位置添加一个名为的文件#define,然后将其链接到您的程序。在为不同的操作系统编译时,您唯一需要更改的是特定操作系统的生成文件路径os.c

于 2013-06-18T13:56:01.367 回答