【问题标题】:which is a good practice to use access function这是使用访问功能的好习惯
【发布时间】:2016-09-23 01:18:46
【问题描述】:

我有以下代码,我也想在带有 GCC 4.8 的 Linux 上工作

这适用于 VS 2013

if ( _access( trigger->c_str(), 0 ) != -1 ) 
{
   ...
}

我知道在 Linux 上我可以使用函数:access from "unistd.h"

有没有办法避免出现以下情况(更优雅的解决方案)?

#ifdef __linux__ 
    #include <unistd.h>
#endif

#ifdef __linux__ 
     if ( access( trigger->c_str(), 0 ) != -1 ) 
     {
          ...
     }
#else
     if ( _access( trigger->c_str(), 0 ) != -1 )
     {
          ...
     }
#endif

【问题讨论】:

  • ...当我说微软将 C++ 视为二等公民时,我感到很伤心。 access() 已被弃用的提议在表面上是愚蠢的。
  • 嗯,他们说他们有。我说我上次检查access() 仍然是 POSIX 的一部分,并且仅在微软的现实扭曲领域内被弃用。
  • access() 无论如何都不是标准的 C++ 函数。它是 POSIX。 Microsoft 声明已弃用是指在其产品中弃用它,而不是从标准中弃用它。它不在 C++ 标准中的事实意味着他们没有义务支持它(假设他们愿意接受那些坚持应该这样做的开发人员的抱怨)——而且他们对 POSIX 的支持一直是(嗯)选择性的。
  • @SamVarshavchik, access 与 C++ 无关。

标签: c++ visual-studio gcc


【解决方案1】:

一种没有重复的解决方案,也不依赖于宏定义(除了用于平台检测的预定义),但样板文件比 Aracthor 的解决方案略多:

#ifdef _WIN32 
    inline int access(const char *pathname, int mode) {
        return _access(pathname, mode);
    }
#else
#include <unistd.h>
#endif

我更喜欢检测 windows,并使用 posix 作为后备,因为 windows 往往比 linux 更常见。

另一个干净的解决方案是定义 _CRT_NONSTDC_NO_WARNINGS 并在 Windows 中继续使用 POSIX 标准 access,而不会发出关于弃用的警告。作为奖励,这也会禁用使用标准 strcpy 而不是 strcpy_s 和类似的警告。后者也是标准的(在 C11 中),但可选且几乎没有任何其他 C 库实现它们(而且,并非 msvc 中的所有 _s 系列函数都符合 C11)。

【讨论】:

    【解决方案2】:

    还有另一种方法,只有标题的解决方案。

    #ifdef __linux__ 
        #include <unistd.h>
    #else
        #define access _access
    #endif
    
    if ( access( trigger->c_str(), 0 ) != -1 ) 
    {
          ...
    }
    

    它将在 Linux 系统上包含正确的文件,并在其他系统上将 access 替换为 _access

    【讨论】:

    • 谢谢。这使它更干净。
    猜你喜欢
    • 2017-03-22
    • 2016-06-27
    • 1970-01-01
    • 1970-01-01
    • 2021-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多