我想将#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";
但是,它没有用......
前缀值为" .. \\\"
任何想法是什么问题..
谢谢!
答案 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,所以用这些术语思考可能会帮助你使用它。