这是使用访问功能的好习惯

时间:2016-05-25 12:25:40

标签: c++ visual-studio gcc

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

这适用于VS 2013

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

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

我知道在Linux上我可以使用函数:来自“unistd.h”的访问

有没有办法避免使用以下内容(更优雅的解决方案)?

logger

2 个答案:

答案 0 :(得分:6)

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

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

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

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

答案 1 :(得分:3)

还有另一种方法,即仅限标题的解决方案。

#ifdef __linux__ 
    #include <unistd.h>
#else
    #define access _access
#endif

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

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