带有字符串文字前缀的预处理器字符串化运算符

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 视为字符串化宏变量的前缀?

是的,use concatenation:

#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.