宏定义中的预处理器标记周围有两个双引号

问题描述 投票:2回答:1

我不了解在C ++中对字符串使用两个双引号的重要性。我在某处看到以下代码:

class str_literal;
static str_literal operator"" _s(const char* s, size_t len);

class str_literal
{

  private:
  explicit str_literal(const char* s) : m_str(s) //&(STRING_LITERAL(s)))
  {
  } 
  const char* m_str;

  public:
  friend str_literal operator"" _s(const char* s, size_t len);
};

static str_literal operator"" _s(const char* s, size_t len)
{
  return str_literal(s);
}

#define S(str) "" str ""_s

为什么不公开构造函数,而只是这样做?

#define S(str) str_literal(str)
c++ c++11 string-literals user-defined-literals
1个回答
1
投票

它们是不必要的。无论谁编写代码,都可能打算利用预处理器将连续的C字符串文字连接为一个文字这样的事实,例如S("hi")产生"" "hi" ""_s,这又产生"hi"_s

但是,在宏定义中不需要第一个""。而且也不需要第二个"",因为我们可以改用token pasting operator ##

#define S(str) str ## _s

这具有完全相同的效果,并且是惯用的。

© www.soinside.com 2019 - 2024. All rights reserved.