【问题标题】:How to properly use `__attribute__((format (printf, x, y)))` for C11 U"unicode literals"?C11 U“unicode literals”如何正确使用`__attribute__((format (printf, x, y)))`?
【发布时间】:2014-12-31 18:54:21
【问题描述】:

我正在将一个应用程序从使用char* 移植到使用 UCS4 作为其内部 Unicode 表示形式。我使用 C11 的 U"unicode literals" 来定义字符串,它扩展为 char32_t 的数组,本质上是 uint32_t

问题在于正确注释printf-like 函数。由于“格式”不再是char*,因此编译器拒绝进一步编译它,我想它也不会对char32_t * 而不是char *%s 格式感到满意。

我完全不依赖 stdlib *printf 系列,所以格式化完全由我的实现来完成。

除了完全禁用此属性之外,还有什么正确的解决方案?

【问题讨论】:

  • 附带问题:您认为使用 UTF-32 代替 UTF-8 有什么好处?你真的确定这值得吗? (UTF-32 也有多码位字形。)
  • 我的应用程序仅在代码点上运行,因此我真的没有必要考虑字素集群、用户感知字符等。 UCS4 极大地简化了字符串处理,因为我可以重用大部分现有代码库,并且我将在下一次迭代中将内部表示迁移到 UTF8。
  • 我似乎也错过了U"..." 的东西,这似乎是一个复杂的步骤,特别是因为 C11 只添加了少量支持来处理这些。您可以只使用"\u2002" 表示法来实现您需要作为mbs 的所有Unicode 代码点。对于问题本身,您可能应该直接询问 gcc 人员。这并不常见,所以你真的需要他们在这个问题上的专业知识。

标签: c gcc unicode c11 unicode-literals


【解决方案1】:

目前在 GCC 中没有办法做到这一点。这是一个已知的错误,请参阅GCC bug 64862

【讨论】:

  • 非常感谢您的更新!是否有关于 clang 的类似信息?
猜你喜欢
  • 2012-07-22
  • 2011-01-22
  • 1970-01-01
  • 2020-09-26
  • 2017-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多