所以我想用传统的方法来处理宏中的字符串化运算符:
#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抱怨:
错误:未在此范围内声明'U'
有没有办法让编译器将U
视为字符串化宏变量的前缀?
答案 0 :(得分:5)
#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))
额外的间接,除了好的,如果你传递一个应该首先评估的宏,是“需要的”因为N3936§16.3.2[cpp.stringize] / 2,它说:
#和##运算符的评估顺序未指定。