2016-05-25 5 views
3

Я следующий код, который я хочу работать и на Linux с GCC 4.8который является хорошей практикой использовать функцию доступа

Это работает с VS 2013

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

Я знаю, что на Linux Я могу использовать функцию: доступ из «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 
+2

Интересно, что [MSDN считает «доступ» устаревшим] (https://msdn.microsoft.com/en-us/library/ms235395.aspx). –

+0

... и я получаю горе, когда утверждаю, что Microsoft рассматривает C++ как гражданина второго сорта. Утверждение, что 'access()' устарело, является глупым по его номиналу. –

+0

@SamVarshavchik У них для этого есть веская причина. –

ответ

6

Решение, которое не имеет никакого дублирования, ни основывается на определении макроса (кроме предопределенного один для обнаружения платформы), но имеет немного больше шаблонного, чем решение Aracthor в:

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

Я предпочитаю, чтобы обнаружить окна и использование posix как откат, потому что окна чаще всего являются исключением, чем linux.

Другим чистым решением было бы определить _CRT_NONSTDC_NO_WARNINGS и продолжать использовать стандарт POSIX access в окнах без предупреждения об устаревании. В качестве бонуса это также отключает предупреждения для использования стандарта strcpy вместо strcpy_s и аналогичного. Последний также является стандартным (в C11), но необязательно, и вряд ли любая другая библиотека C реализует их (а также не все семейные функции в msvc соответствуют C11).

2

Существует другой способ, только для заголовка.

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

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

Он будет включать нужный файл на системах Linux и заменить access с _access на других системах.

+0

Спасибо. Это делает его более чистым. – cristian

Смежные вопросы