预处理器使用字符串文字前缀对运算符进行字符串化

时间:2015-04-24 14:26:58

标签: macros c-preprocessor string-literals stringification

所以我想用传统的方法来处理宏中的字符串化运算符:

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

1 个答案:

答案 0 :(得分:5)

是的,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))

额外的间接,除了好的,如果你传递一个应该首先评估的宏,是“需要的”因为N3936§16.3.2[cpp.stringize] / 2,它说:

  

#和##运算符的评估顺序未指定。