2016-10-25 3 views
2

#defineからstringに変換したいと思います。#defineからstringへ変換する++

マイコード:

#ifdef WIN32 
#define PREFIX_PATH = "..\\" 
#else 
#define PREFIX_PATH = "..\\..\\" 
#endif 


#define VAL(str) #str 
#define TOSTRING(str) VAL(str) 

string prefix = TOSTRING(PREFIX_PATH); 
string path = prefix + "Test\\Input\input.txt"; 

しかし、それは動作しませんでした。..

プレフィックス値がある ".. \\\"

問題が何であるか任意のアイデア..

ありがとうございます!

+1

この仕事 '文字列プレフィックス=で、prefix_pathです;' – Danh

+1

'文字列プレフィックス=で、prefix_path;' – UKMonkey

+0

は 'PREFIX_PATH'はすでに引用符で囲まれた文字列として定義されていますが、それは引用しようとすると' VAL'、通過していますシンボルを '# 'で再表示します。また、Windows以外のOSでは通常、パス区切り文字としてバックスラッシュを使用せず、スラッシュを使用しています。 –

答えて

3

定義では "="、二重引用符で囲まれた文字列では#str、または "+"は必要ありません。

#ifdef WIN32 
    #define PREFIX_PATH "..\\" 
#else 
    #define PREFIX_PATH "..\\..\\" 
#endif 

string path = PREFIX_PATH "Test\\Input\\input.txt"; 
5

このような簡単なことはどうですか?

#ifdef WIN32 
const std::string prefixPath = "..\\"; 
#else 
const std::string prefixPath = "..\\..\\"; 
#endif 

std::string path = prefixPath + "Test\\Input\\input.txt"; 

PSあなたがinput.txt前に別の\を逃す可能性のある最後の行のタイプミスを有していてもよいです。あなたのC++コンパイラはこのC++ 11機能をサポートしている場合

代替として

、あなたは生の文字列リテラルを使用する場合がありますので、あなたはエスケープされていない\を持つことができ、例えば:

std::string path = prefixPath + R"(Test\Input\input.txt)"; 
+0

_ "私はあなたの質問からほとんどコピーして貼り付けた" _ほとんど?それはちょうどあなたがやったことです:P –

+0

@LightnessRacesinOrbit:正確には、 'prefix'ではなく' prefixPath'に注意してください:) –

2

私は」が、 Dは非常にMr.C64のアプローチをお勧めしますが、あなたが使用したい場合は、キーと値の間で等しい入れていないの#defineについて

#ifdef WIN32 
    #define PREFIX_PATH "..\\" 
#else 
    #define PREFIX_PATH "..\\..\\" 
#endif 

std::string prefix = PREFIX_PATH; 
std::string path = PREFIX_PATH + "Test\\Input\\input.txt"; 

、その後、何らかの理由で定義して、ToString関数は不要でした。 #defineは単にfind-replaceであるため、これらの用語で考えると使い方が助けになるかもしれません。

関連する問題