新的char8_t
如何与C接口一起使用?
extern "C"
{
struct PangoLayout;
void pango_layout_set_text(PangoLayout* layout, char const* text, int length);
}
#include <string_view>
void printText(PangoLayout* layout, std::u8string_view str)
{
// Does not compile:
// pango_layout_set_text(layout, static_cast<char const*>(str.data()), std::size(str));
// Does not compile:
// pango_layout_set_text(layout, static_cast<char const*>(str.data()), std::size(str));
// UB?:
pango_layout_set_text(layout, reinterpret_cast<char const*>(str.data()), std::size(str));
}
void hello(PangoLayout* layout)
{
printText(layout, u8"Hello@ł€ð®þ$đßđ®");
}
在这种情况下,最好继续使用char吗?这样可以避免reinterpret_cast
,但也会降低表达能力。
答案 0 :(得分:1)
免责声明:我是char8_t
P0482提案的作者。
P1423介绍了旨在帮助解决由于采用P0482而导致的向后兼容性问题的许多方法和技术。
使用reinterpret_cast
是可行的(如果令人反感的)选项。请注意,由于char8_t
不是别名类型,因此reinterpret_cast
不能用于获取基于char8_t
的指向char
或{{1基于}}的数据,但可以在另一方向使用unsigned char
(因为已经允许reinterpret_cast
和char
为所有类型加上别名;请参见[basic.lval]p11)。>
避免在整个代码库中撒满unsigned char
的一种选择是提供重载包装基于reinterpret_cast
的接口。例如:
char