【问题标题】:Convert from #define to string c++从#define转换为字符串c ++
【发布时间】:2017-03-07 08:27:20
【问题描述】:

我想从#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";

但是,它没有工作..

前缀值为“..\\\”

知道是什么问题..

谢谢!

【问题讨论】:

  • 这是作品string prefix = PREFIX_PATH;
  • string prefix = PREFIX_PATH;
  • PREFIX_PATH 已定义为带引号的字符串,但它通过VAL 传递,它尝试再次使用# 引用符号。另外请注意,非 Windows 操作系统通常使用正斜杠,而不是反斜杠作为路径分隔符。
  • 你的宏定义有误。

标签: c++ string c-preprocessor


【解决方案1】:

那么简单的东西呢?

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

【讨论】:

  • “我几乎是从你的问题中复制粘贴过来的” 几乎?这正是你所做的:P
  • @LightnessRacesinOrbit:不完全是,注意prefixPath 而不是prefix :)
【解决方案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 只是查找-替换,因此从这些方面思考可能会帮助您使用它。

【讨论】:

    【解决方案3】:

    定义中不需要“=”,也不需要任何#str,或双引号字符串之间的“+”。

    #ifdef WIN32
        #define PREFIX_PATH "..\\"
    #else
        #define PREFIX_PATH "..\\..\\"
    #endif
    
    string path = PREFIX_PATH "Test\\Input\\input.txt";
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-05
      • 2013-06-16
      • 1970-01-01
      • 1970-01-01
      • 2013-08-20
      相关资源
      最近更新 更多