从#define转换为字符串c ++

时间:2016-10-25 10:22:38

标签: c++ string c-preprocessor

我想将#define转换为字符串。

我的代码:

#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";

但是,它没有用......

前缀值为" .. \\\"

任何想法是什么问题..

谢谢!

3 个答案:

答案 0 :(得分: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)";

答案 1 :(得分:3)

你不需要" ="在定义,或任何#str,或" +"在双引号字符串之间。

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

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

答案 2 :(得分:2)

虽然我强烈推荐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";

对于#define,你不要在键和值之间放置一个等号,并且不需要TOSTRING功能。 #define只是find-replace,所以用这些术语思考可能会帮助你使用它。