带有字符串文字前缀的预处理器字符串化运算符
Preprocessor Stringizing Operator with String Literal Prefixes
所以我想用宏中的字符串化运算符做传统的事情:
#define FOO(x) foo(#x, (x))
但是我需要使用字符串文字前缀:http://en.cppreference.com/w/cpp/language/string_literal
这是个问题,因为如果我需要 UTF-32 字符串文字,我会尝试这样做:
#define FOO(x) foo(U#x, (x))
但是 gcc 4.9.2 抱怨:
error: 'U' was not declared in this scope
有没有办法让编译器将 U
视为字符串化宏变量的前缀?
#define CONCAT2(x, y) x ## y
#define CONCAT(x, y) CONCAT2(x, y)
#define STRINGIZE(x) #x
#define FOO(x) foo(CONCAT(U, STRINGIZE(x)), (x))
额外的间接寻址,除了如果你传递一个应该首先评估的宏是好的,"needed" 因为 N3936 §16.3.2 [cpp.stringize]/2,它说:
The order of evaluation of # and ## operators is unspecified.
所以我想用宏中的字符串化运算符做传统的事情:
#define FOO(x) foo(#x, (x))
但是我需要使用字符串文字前缀:http://en.cppreference.com/w/cpp/language/string_literal
这是个问题,因为如果我需要 UTF-32 字符串文字,我会尝试这样做:
#define FOO(x) foo(U#x, (x))
但是 gcc 4.9.2 抱怨:
error: 'U' was not declared in this scope
有没有办法让编译器将 U
视为字符串化宏变量的前缀?
#define CONCAT2(x, y) x ## y
#define CONCAT(x, y) CONCAT2(x, y)
#define STRINGIZE(x) #x
#define FOO(x) foo(CONCAT(U, STRINGIZE(x)), (x))
额外的间接寻址,除了如果你传递一个应该首先评估的宏是好的,"needed" 因为 N3936 §16.3.2 [cpp.stringize]/2,它说:
The order of evaluation of # and ## operators is unspecified.