Определите если Linux или Windows в C++

Я пишу межплатформенную совместимую функцию в C++, который создает каталоги на основе входных имен файлов. Я должен знать, является ли машиной Linux или окна, и используйте соответствующее вперед или наклонную черту влево. Для следующего кода ниже, если машиной является 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); 
22
задан Elpezmuerto 9 July 2010 в 13:32
поделиться

4 ответа

Use:

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

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

41
ответ дан 29 November 2019 в 03:53
поделиться

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

Тем не менее, если вы используете boost::filesystem, вам следует использовать portable generic path format, чтобы вы могли забыть о подобных вещах.

13
ответ дан 29 November 2019 в 03:53
поделиться

Загляните в 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;
}
1
ответ дан 29 November 2019 в 03:53
поделиться

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

0
ответ дан 29 November 2019 в 03:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: