Определите, будет ли 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);
Ответы
Ответ 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, которые идентифицируют компиляторы/операционные системы и многое другое. (привязка непосредственно к подсайту операционной системы)