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

标签 c++ c++11 string-literals user-defined-literals

我不明白在 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 字符串文字连接成一个文字,以便例如S("hi") 产生 """hi"""_s,而 """hi"""_s 又产生 "hi"_s

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

#define S(str) str ## _s

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

关于c++ - 宏定义中预处理器标记周围有两个双引号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59138304/

相关文章:

未找到 C++ 正则表达式搜索模式

C++ 未初始化的结构成员 - 字段不存在

c++ - clang - shared_ptr 无法运行其删除程序

c++ - 后缀模板 <T_>

c - 奇怪的 gcc 错误杂散/缺少终止“C 中的字符

c++ - 此方法不适合使用 2D 坐标作为 std::unordered_map 中的键吗?

C++20 非类型模板参数是先前类型参数 : is not a valid template arg, 中的模板,因为它不是变量

C++ 11:普通字符串文字和UTF-8字符串文字之间的区别示例?

c++ - 为什么字符串文字只能在某些情况下隐式转换为 char*?

c - 我想知道为什么不需要为字符串绑定(bind)内存就可以工作