Инициализатор в кавычках для массива без знака в C

Кажется, это работает в GCC и Visual C без комментариев:

static const **unsigned** char foo[] = "bar";

Эта соль используется в модульном тесте. Есть и другие способы сделать это, но это самый простой и включает в себя наименьшее количество бросок вниз по линии.

Не вызовет ли это проблемы с другими компиляторами?

1 ответ

Это безопасно, по крайней мере, если вы используете соответствующий компилятор Си.

N1570 6.7.9 параграф 14 гласит:

Массив символьного типа может быть инициализирован символьным строковым литералом или строковым литералом UTF-8, необязательно заключенным в фигурные скобки. Последовательные байты строкового литерала (включая завершающий нулевой символ, если есть место или если массив имеет неизвестный размер) инициализируют элементы массива.

Стандарт C90 имеет практически одинаковую формулировку, поэтому вам не нужно беспокоиться о старых компиляторах.

Типы персонажей char, signed char, а также unsigned char,

Интересно, что нет соответствующей гарантии для инициализации указателя, так что это:

const char *ptr = "hello";

безопасно, но это:

const unsigned char *uptr = "hello";

нет - и, кажется, не существует простого обходного пути.

Другие вопросы по тегам