使用预处理器创建用户自定义字面量

3

我正在尝试编写一个宏,将常规字符串字面量转换为用户定义的字面量。以下两行代码应该创建 "foobar"_literal 标记:

#define AS_LITERAL(TEXT) TEXT ## _literal
AS_LITERAL("foobar");

然而,GCC-4.7 的预处理器报告以下错误:
error: pasting ""foobar"" and "_literal" does not give a valid preprocessing token

如何正确地做到这一点?

"foobar"_literal 是合法的 C 代码吗? - Oliver Charlesworth
只是猜测,但编译器可能会将C字符串字面量和您定义的名称视为2个不同的标记,因此请尝试删除“##”。 - lvella
1
@KonradRudolph:嗯,是的,在我看来。如果目标有缺陷,那么问题可能也是如此... - Oliver Charlesworth
2
顺便说一句,这是一个有效的问题。我怀疑大多数人没有意识到它是关于C++11的。 - Konrad Rudolph
如果您打算将字面量包装在AS_LITERAL()中,那么我认为您可以使用原型为AS_LITERAL(const char*)的简单函数而不使用C++11功能来完成此操作。从预处理器转到operator""的意义何在? - Andrew Tomazos
显示剩余3条评论
1个回答

5

它需要一个适当定义的operator "" _literal(在使用GCC 4.7时也是如此):

#include <cstdlib>

#define AS_LITERAL(TEXT) TEXT ## _literal

constexpr int operator "" _literal(char const*, std::size_t) { return 0; }

int main() {
    int x = AS_LITERAL("abc");
}

谢谢。重要的信息是,它应该与GCC-4.7一起使用。再次检查后,我注意到我忘记使用命令行选项“-std=c++11”。 - nosid
我在这里尝试使用GCC 4.6编译,但失败了。看起来OP的问题只是编译器不支持该特性。 - lvella
用户定义字面量支持被添加到GCC 4.7中。 - Andrew Tomazos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接