Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
确定Linux或Windows是否在C++; 我正在编写一个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);_C++_Windows_Linux_Cross Platform - Fatal编程技术网

确定Linux或Windows是否在C++; 我正在编写一个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);

确定Linux或Windows是否在C++; 我正在编写一个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);,c++,windows,linux,cross-platform,C++,Windows,Linux,Cross Platform,一般来说,您必须使用条件编译来实现这一点 也就是说,如果您使用的是boost::filesystem,那么您应该使用,这样您就可以忘记类似的事情。最常用的方法之一是使用。链接是C,但它们在C++中使用相同的方式。公平警告,每个编译器和操作系统都可以有自己的指令集。使用: #if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) static const std::string

一般来说,您必须使用条件编译来实现这一点


也就是说,如果您使用的是
boost::filesystem
,那么您应该使用,这样您就可以忘记类似的事情。

最常用的方法之一是使用。链接是C,但它们在C++中使用相同的方式。公平警告,每个编译器和操作系统都可以有自己的指令集。

使用:

#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__)
static const std::string slash="\\";
#else
static const std::string slash="/";
#endif
顺便说一句,您仍然可以在Windows上安全地使用此斜杠“/”,因为Windows对此非常理解。因此,只要坚持使用“/”斜杠就可以解决所有操作系统的问题,就像路径为
foo:[bar.bee]test.ext的OpenVMS一样,ext
可以表示为
/foo/bar/bee/test.ext

调查

如果您使用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;
}
#包括
#包括
#包括
int main()
{
结构utsname sysinfo;
if(uname(&sysinfo))退出(9);
printf(“操作系统名称:%s\n”,sysinfo.sysname);
返回0;
}

默认情况下,Visual Studio在预处理器项目设置中定义
s
\u WIN32

所以你可以用

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

是识别编译器/操作系统等的各种宏的综合集合。(直接链接到操作系统子站点)

如果您不打算向用户显示路径,那么您可以保持它的简单性,只需使用正斜杠即可。Windows两者都懂。(但是,如果您确实计划显示它,那么您可能应该在Windows上使用反斜杠-与操作系统一致看起来更好。)有一些Win32函数不喜欢不正确的Win32目录分隔符“/”。但若您使用Win32函数,那个么您可能已经知道您的目标是Windows。@Andreas,哪些Win32函数在“/”方面有问题?我所说的“很少”实际上是指“很少”…)我认为其中一些是敏感的:此外,这里有一个明确的警告:。尽管如此,我反对正斜杠的主要原因是,当我在Microsoft Windows路径中看到一个正斜杠时,它会刺痛我的眼睛……我没有尝试过,但是浏览器在用户输入的路径中使用的shell函数应该是非常防滥用的(尽管它可能只是在传递给它们之前清理所有输入).Windows在
@Billy中没有任何内容。请务必在否决表决前阅读。我提到了g++,GNU支持这一点。我已经在g++/CYGWIN上编译了代码。@billyoneal-当使用MinGW或CYGWIN时,Windows可以拥有它。我确实读过这篇文章。Cygwin不是windows,它是构建在windows之上的仿真层。我不确定我是否理解“OpenVMS:”SYS1::DISK1:[JANE.TYLER.HARRY]”示例被视为具有系统名、驱动器名和三个目录文件名的本机路径名,而不是具有一个文件名的可移植路径名。--windows:\\JANE\\TYLER\\HARRY被视为具有驱动器号、根目录和三个文件名的本机路径名,而不是具有一个文件名的可移植路径名。如果full_path.native_directory_string()。。。它不会以正确的格式输出。我可以说您的最终目录路径应该类似于C:/toys/blocks。