Определите, является ли Linux или Windows C ++ - PullRequest
21 голосов
/ 09 июля 2010

Я пишу кроссплатформенную совместимую функцию на C ++, которая создает каталоги на основе входных имен файлов.Мне нужно знать, является ли машина Linux или Windows, и использовать соответствующую прямую или обратную косую черту.Для следующего кода ниже, если на компьютере установлена ​​ОС Linux, тогда isLinux = true.Как определить ОС?

bool isLinux;
std::string slash;
std::string directoryName;

if isLinux
   slash = "/";
else
   slash = "\\";
end

boost::filesystem::create_directory (full_path.native_directory_string() + slash + directoryName); 

Ответы [ 6 ]

40 голосов
/ 09 июля 2010

Использование:

#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__)
static const std::string slash="\\";
#else
static const std::string slash="/";
#endif

Кстати, вы все еще можете безопасно использовать эту косую черту "/" в Windows, поскольку Windows прекрасно это понимает.Таким образом, простое использование косой черты "/" решит проблемы для всех ОС, даже таких как OpenVMS, где путь равен foo:[bar.bee]test.ext и может быть представлен как /foo/bar/bee/test.ext.

13 голосов
/ 09 июля 2010

Вообще говоря, вы должны сделать это с помощью условной компиляции.

Тем не менее, если вы используете boost::filesystem, вам следует использовать переносимый формат общего пути , так чточто вы можете забыть о таких вещах.

4 голосов
/ 26 декабря 2012

По умолчанию Visual Studio #define s _WIN32 в настройках проекта препроцессора.

Таким образом, вы можете использовать

// _WIN32 = we're in windows
#ifdef _WIN32
// Windows
#else
// Not windows
#endif
1 голос
/ 09 июля 2010

Посмотрите на http://en.wikipedia.org/wiki/Uname

Если вы используете g ++ в качестве компилятора / GNU, вы можете попробовать код ниже.POSIX-совместимые среды поддерживают это:

#include <stdio.h>
#include <sys/utsname.h>
#include <stdlib.h>

int main()
{
    struct utsname sysinfo;
    if(uname(&sysinfo)) exit(9);
    printf("os name: %s\n", sysinfo.sysname);
    return 0;
}
0 голосов
/ 26 декабря 2012

beforef.sourceforge.net - это всеобъемлющая коллекция всех видов MACRO, которые идентифицируют компиляторы / операционные системы и многое другое. (ссылка непосредственно на сайт операционной системы)

0 голосов
/ 09 июля 2010

Один из наиболее часто используемых методов для этого - директива препроцессора . Ссылка для C, но они так же используются в C ++. Честное предупреждение, каждый компилятор и ОС могут иметь свой собственный набор директив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...