【问题标题】:Why include direct.h or sys/stat.h conditionally based on _WIN32 or __linux__?为什么要根据 _WIN32 或 __linux__ 有条件地包含 direct.h 或 sys/stat.h?
【发布时间】:2014-10-06 11:24:12
【问题描述】:

下面的代码会做什么?为什么使用它?

  #ifdef _WIN32
  #include <direct.h>
  #elif defined __linux__
  #include <sys/stat.h>
  #endif

【问题讨论】:

  • 我真的不明白为什么所有的反对票?对我来说,这似乎是一个非常有效的问题。

标签: c ifdefine


【解决方案1】:

它决定要包含的库

因此,如果您在 Win32 平台上运行代码,它会使用 direct.h 库。

如果检测到它在 Linux 平台上运行,则使用 sys/stat.h 库

库的可用性因平台而异,并且可能不可用。 我倾向于尽可能地忽略那些库。 IE。 conio.h 仅适用于旧的 MS DOS 输入环境,无法在 Linux/GNU 环境中使用

【讨论】:

  • 我会三思而后行的“标准”;)
  • 其实它决定了要包含哪个头文件,这是一个完全独立于链接库的步骤。
【解决方案2】:

C 中没有可移植的方式来操作文件系统目录。您需要一些提供包装器接口的库来操作目录。 (使用系统调用、操作系统中断例程等)

direct.h 是 Windows 的 C 编程语言的头文件。它包含用于操作文件系统目录的函数和所需宏、结构等的声明。在类似Linux的系统中,您可以使用sys/stat.h

现在,如果您的代码可以针对任一操作系统进行编译,您可以在没有任何保护的情况下保留通用(可移植)代码,并将特定于 windows 或 linux 的代码保留在 conditional compilation 块中。

如果您没有有条件地包含这些文件,您可能会在 Linux 中收到 direct.h not found 或类似错误,在 Windows 中可能会收到任何类似错误。

__linux__ 由针对 Linux 代码的编译器预定义。

Thismsdn 文档说:

_WIN32:为 Win32 和 Win64 应用程序定义。始终定义。

【讨论】:

    【解决方案3】:

    这是一个条件语句,但用于编译时间。 当程序被编译时,它会寻找它正在运行的平台,并为您的操作系统包含正确的头文件(这些库是为特定的操作系统实现的):

    • direct.h 用于 Windows
    • sys/stat.h 用于 GNU/Linux

    它就像经典的if/else 语句一样工作:

    if(platform == windows)
    {
        take_windows_lib();
    }
    else if (platform == linux)
    {
        take_linux_lib();
    }
    

    【讨论】:

      猜你喜欢
      • 2015-01-30
      • 1970-01-01
      • 2013-08-19
      • 2021-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多