【问题标题】:mkdir Windows vs Linuxmkdir Windows 与 Linux
【发布时间】:2012-05-08 13:27:19
【问题描述】:

我在将 Linux 工具移植到 Windows 时遇到问题。我在 Windows 系统上使用 MinGW。我有一个处理所有输入/输出的类,其中是这一行:

mkdir(strPath.c_str(), 0777); // works on Linux but not on Windows and when it is changed to
_mkdir(strPath.c_str()); // it works on Windows but not on Linux

任何想法我可以做什么,以便它在两个系统上都适用?

【问题讨论】:

  • 您可以确定您在哪个系统上并使用正确的系统。类似#ifdef LINUX ... #else ... #endif
  • 条件编译?
  • Aside:你的意思是使用0777,而不是777。它们是非常不同的数字。
  • 为什么一个标准的 c 函数,为了便于移植,需要一个条件宏 if?拥有标准库的全部意义不是不需要使用宏吗?标准库过时了吗?为什么我们没有一个闪亮的新标准库来取代 stdio 和 iostream 并以可移植的方式满足常见用例?
  • @Dmitry: mkdir 不是标准的 C 函数。这是一个标准的 Posix 函数。 Posix 标准将函数注入 C 运行时,从 C++ 标准的角度来看,这在技术上使标头非标准。许多 unix 托管的编译器及其相应的库选择遵守 Posix,但 Microsoft 选择遵守 C++ 标准。因此,对于它们提供的 Posix 函数的子集,Microsoft 在名称前加上下划线,使它们“为编译器和库实现者保留”,正如 C++ 标准所允许的那样。

标签: c++ windows linux mkdir


【解决方案1】:
#if defined(_WIN32)
_mkdir(strPath.c_str());
#else 
mkdir(strPath.c_str(), 0777); // notice that 777 is different than 0777
#endif

【讨论】:

  • "_WIN32 - 为 Win32 和 Win64 的应用程序定义"。 (参考:msdn.microsoft.com/en-us/library/b0084kay.aspx)因此这里不需要检查_WIN64。
  • 作为参考,这是一件很棒的事情。不过,短路评估在这种情况下没有实际意义。
  • 不应该是#if defined(_WIN32) || defined(_WIN64) 有效吗?没有 #ifdef foo || bar 这样的东西 - 据我所知,它不是有效的预处理器语法。
  • @Greg 你误会了。 #ifdef constant_name 有效。 #ifdef foo || bar 不是。 #ifdef 不接受表达式。你用什么编译器接受这样的语法?
  • _mkdir 包含在 Visual Studio 中的 direct.h 中,但在 GCC 中不存在。您可能要添加#ifdef _MSC_VER #include <direct.h> #endif
【解决方案2】:

您应该能够使用条件编译来使用适用于您正在编译的操作系统的版本。

另外,您真的确定要将标志设置为 777(如在大开中,请在此处存放您的病毒)?

【讨论】:

  • 危险地生活! ;)
【解决方案3】:

您可以使用一些预处理器指令有条件地编译,您可以在此处找到完整的列表:C/C++ Compiler Predefined Macros

#if defined(_WIN32)
    _mkdir(strPath.c_str());
#elif defined(__linux__)
    mkdir(strPath.c_str(), 0777);
// #else more?
#endif

【讨论】:

  • @EricJ。 - _WIN32 也在 64 位窗口中定义。
猜你喜欢
  • 2010-10-28
  • 1970-01-01
  • 1970-01-01
  • 2010-10-18
  • 1970-01-01
  • 1970-01-01
  • 2016-08-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多