2014-11-04 5 views
5

Я переношу приложение с помощью char* для всего и везде, используя UCS4, поскольку это внутреннее представление Unicode. Я использую C11's U"unicode literals" для определения строк, которые расширяются до массивов char32_t, которые по существу являются uint32_t.Как правильно использовать `__attribute __ ((format (printf, x, y)))` для C11 U "Unicode литералы"?

Проблема заключается в надлежащей аннотации printf-подобных функций. Поскольку «формат» больше не char*, компилятор отказывается компилировать его дальше, так же он будет недоволен char32_t * вместо char * для формата %s, я полагаю.

Я не зависим от stdlib *printf семьи вообще, поэтому форматирование выполняется исключительно по моей реализации.

Какое правильное решение для этого, кроме как полностью отключить этот атрибут?

+0

Вопрос: Какую выгоду вы бы выиграли от использования UTF-32 вместо UTF-8? И вы действительно уверены, что это того стоит? (UTF-32 имеет также символы с несколькими кодами.) – Deduplicator

+1

Мое приложение работает исключительно на кодовых точках, поэтому нет смысла рассматривать кластеры grapheme, воспринимаемые пользователем символы и т. Д. На данный момент UCS4 значительно упрощает обработку строк, поскольку я могу повторно использовать большую часть существующей кодовой базы, и я буду переносить внутреннее представление в UTF8 на следующей итерации. – toriningen

+0

Я также, кажется, пропустил пункт 'U ... ...' 'материал, кажется сложным шагом, в частности, поскольку C11 добавляет лишь незначительную поддержку для их обработки. Вы могли бы просто использовать нотацию '' \ u2002 '' для реализации всех кодов Юникода, которые вам нужны как mbs. Для самого вопроса вы должны, вероятно, напрямую обратиться к людям gcc. Это не очень распространено, поэтому вам действительно нужен их опыт в этом вопросе. –

ответ

1

В настоящее время в GCC нет возможности сделать это. Это известная ошибка, см. GCC bug 64862

+1

Большое спасибо за обновление! Любая подобная информация о кланге может быть? – toriningen