Подтвердить что ты не робот

Определите, будет ли Linux или Windows на С++

Я пишу кросс-платформенную совместимую функцию в С++, которая создает каталоги на основе входных имен файлов. Мне нужно знать, является ли машина 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); 
4b9b3361

Ответ 1

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

#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.

Ответ 2

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

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

Ответ 3

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

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

// _WIN32 = we're in windows
#ifdef _WIN32
// Windows
#else
// Not windows
#endif

Ответ 4

Посмотрите 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;
}

Ответ 5

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

Ответ 6

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