2016-05-25 13 views
3

Ich habe den folgenden Code ein, den ich mit GCC 4.8, die eine gute Praxis ist Zugriffsfunktion zu verwenden

Dieser arbeitet mit VS 2013

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

Ich weiß auch auf Linux arbeiten will, dass auf Linux Ich kann Funktion verwenden: Zugriff von "unistd.h"

Gibt es eine Möglichkeit zu vermeiden, etwas wie folgt (eine elegantere Lösung) zu haben?

#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

Interessanterweise betrachtet [MSDN "Zugriff" als veraltet] (https://msdn.microsoft.com/en-us/library/ms235395.aspx). –

+0

... und ich bekomme Trauer, wenn ich feststelle, dass Microsoft C++ als Bürger zweiter Klasse behandelt. Die Aussage, dass "access()" veraltet ist, ist albern auf ihrem Nennwert. –

+0

@SamVarshavchik Sie scheinen einen guten Grund dafür zu haben. –

Antwort

6

Eine Lösung, die keine Doppelarbeit hat, noch stützt sich auf einer Makrodefinition (neben den vordefinierten eines für Plattform-Erkennung), hat aber etwas mehr vorformulierten als Aracthor Lösung:

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

Ich ziehe Fenster zu erkennen, und die Verwendung posix als fallback, weil windows eher die ausnahme ist als linux.

Eine weitere saubere Lösung wäre, _CRT_NONSTDC_NO_WARNINGS zu definieren und weiterhin den POSIX-Standard access in Windows zu verwenden, ohne Warnungen über die Veraltetheit. Als Bonus werden auch Warnungen für die Verwendung des Standards strcpy anstelle von strcpy_s und ähnlich deaktiviert. Letzteres ist ebenfalls Standard (in C11), aber optional und kaum eine andere C-Bibliothek implementiert sie (und auch nicht alle der _s Familienfunktionen in msvc entsprechen C11).

2

Es gibt einen anderen Weg, Header-only-Lösung.

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

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

Es wäre die richtige Datei auf Linux-Systemen enthalten und access mit _access auf anderen Systemen ersetzen.

+0

Danke. Dies macht es sauberer. – cristian

Verwandte Themen