宏定义中预处理器标记周围的两个双引号
Two double quotes around preprocessor token in macro definition
我不明白在 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
为什么不创建构造函数 public 就这样做呢?
#define S(str) str_literal(str)
它们是不必要的。编写代码的人可能打算使用这样一个事实,即预处理器将连续的 C 字符串文字连接成一个文字,例如S("hi")
导致 "" "hi" ""_s
,进而导致 "hi"_s
。
但是,宏定义中不需要第一个""
。而且也不需要第二个 ""
,因为我们可以使用 token pasting operator ##
代替:
#define S(str) str ## _s
这具有完全相同的效果,并且是惯用的。
我不明白在 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
为什么不创建构造函数 public 就这样做呢?
#define S(str) str_literal(str)
它们是不必要的。编写代码的人可能打算使用这样一个事实,即预处理器将连续的 C 字符串文字连接成一个文字,例如S("hi")
导致 "" "hi" ""_s
,进而导致 "hi"_s
。
但是,宏定义中不需要第一个""
。而且也不需要第二个 ""
,因为我们可以使用 token pasting operator ##
代替:
#define S(str) str ## _s
这具有完全相同的效果,并且是惯用的。