web-dev-qa-db-ja.com

LinuxまたはWindowsがC ++であるかどうかを確認します

入力ファイル名に基づいてディレクトリを作成するクロスプラットフォーム互換の関数をC++で作成しています。マシンがLinuxなのかWindowsなのかを知り、適切なスラッシュまたはバックスラッシュを使用する必要があります。以下の次のコードでは、マシンがLinuxの場合、isLinux = true。 OSを確認するにはどうすればよいですか?

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); 
23
Elpezmuerto

使用する:

#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のようにすべてのOSの問題が解決されます。これは/foo/bar/bee/test.extとして表すことができます。

43
Artyom

一般的に言えば、条件付きコンパイルでこれを行う必要があります。

とはいえ、boost::filesystemを使用している場合は、このようなことを忘れることができるように、 ポータブル汎用パス形式 を使用する必要があります。

13
Billy ONeal

デフォルトでは、Visual Studio #defines _WIN32プリプロセッサプロジェクトの設定。

だからあなたは使うことができます

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

調べてください http://en.wikipedia.org/wiki/Uname

コンパイラ/ GNUとしてg ++を使用している場合は、以下のコードを試すことができます。 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;
}
2
Fanatic23

これを行うために最もよく使用される方法の1つは、 プリプロセッサディレクティブ を使用することです。リンクはC用ですが、C++でも同じように使用されます。公正な警告です。各コンパイラとOSは、独自のディレクティブのセットを持つことができます。

0
nathan

predef.sourceforge.net は、コンパイラ/オペレーティングシステムなどを識別するすべての種類のMACROの包括的なコレクションです。 (オペレーティングシステムのサブサイトに直接リンクしています)

0
Ronny Brendel