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

Macros 带字符串文字前缀的预处理器字符串化运算符,macros,c-preprocessor,string-literals,stringification,Macros,C Preprocessor,String Literals,Stringification,因此,我想在宏中使用字符串化操作符执行传统的操作: #define FOO(x) foo(#x, (x)) 但是,我需要使用字符串文字前缀: 这是一个问题,因为如果我需要UTF-32字符串文字,我会尝试这样做: #define FOO(x) foo(U#x, (x)) 但gcc 4.9.2抱怨: 错误:“U”未在此作用域中声明 有没有办法让编译器将U视为字符串化宏变量的前缀?有: 由于N3936§16.3.2[cpp.stringize]/2的规定,“需要”额外的间接性,除了在传递应首先计算

因此,我想在宏中使用字符串化操作符执行传统的操作:

#define FOO(x) foo(#x, (x))
但是,我需要使用字符串文字前缀:
这是一个问题,因为如果我需要UTF-32字符串文字,我会尝试这样做:

#define FOO(x) foo(U#x, (x))
但gcc 4.9.2抱怨:

错误:“U”未在此作用域中声明

有没有办法让编译器将
U
视为字符串化宏变量的前缀?

有:

由于N3936§16.3.2[cpp.stringize]/2的规定,“需要”额外的间接性,除了在传递应首先计算的宏时表现良好外,还表示:

未指定#和##运算符的求值顺序


@leemes,只要结果是一个预处理标记,你就可以了
U“abc”
是一个字符串文字,它是一个预处理标记。@leemes在Visual Studio T上根本没有定义
U“abc”
字符串文字。T@JonathanMee,在2015年预览版中!
#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))