Опция компилятора строки с нулевым символом в конце для gcc - PullRequest
7 голосов
/ 03 декабря 2010

Обновление

Оказывается, это просто еще один случай "c ++ не c блюз"


Что я хочу

const char hex[16] = "0123456789ABCDEF";

единственное, что работает

char hex[16] = "0123456789ABCDE"; hex[15] = "F";

есть ли какие-либо опции компилятора или что-то, что я могу сделать, чтобы строки, не равные NULL, заканчивались в компиляторе gcc. так что я могу сделать (n) константный массив

Ответы [ 5 ]

11 голосов
/ 03 декабря 2010

Нет необходимости в параметре компилятора, он уже не имеет значения NUL. Стандарт гласит, что NUL следует добавлять, только если он может соответствовать, в противном случае это будет переполнением. Может случиться так, что следующий байт в памяти после вашего массива будет \0

& секта; 6.7.8p14

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

7 голосов
/ 03 декабря 2010

Нет.NUL-концевые строки являются неотъемлемой частью языка.Вы можете иметь массив символов, и устанавливать каждый символ один за другим:

char hex [] = {'0', '1', '2', ... 'F'};
5 голосов
/ 03 декабря 2010

Вы ответили на свой вопрос. Если вы явно дадите массиву длину, как в:

const char hex[16] = "0123456789ABCDEF";

тогда, конечно, он не будет иметь нулевое завершение, потому что нет хранилища, зарезервированного для нулевого завершения. (hex[16] находится за пределами объекта, и, таким образом, чтение или запись - это неопределенное поведение. Если это читается как 0, это UB для вас ...)

Это только если вы оставите длину неявной, как в:

const char hex[] = "0123456789ABCDEF";

или если вы используете строковый литерал как объект, а не как инициализатор, то он будет иметь нулевое завершение.

Кстати, почему вас волнует, есть ли нулевое завершение или нет, если вы не планируете его использовать. Вы пытаетесь сбрить байты с вашего двоичного файла? : -)

0 голосов
/ 16 ноября 2014

Я полагаю, что вопрос немного неясен: в C инициализируемая инициализация:

static const char hex[16] = "0123456789ABCDEF";

является законной.В C ++ это не так.Так что это один из фрагментов кода, который завершается неудачно (к счастью во время компиляции), когда вы переходите с C на C ++.

Было бы неплохо иметь способ принудительного выполнения строковых литералов без завершения \ 0 байт,Что-то вроде:

static const char hex[16] = "0123456789ABCDEF\!0";

, где \!0 в конце говорит компилятору не завершать строку нулем!\! или даже \!0 в любом месте строки будет вести себя без изменений, так что просто выведите литерал ! или !0.

0 голосов
/ 03 декабря 2010

Строки завершаются нулем в C. Если вы хотите заполнить массив символов, не заканчивающийся нулем, вы можете использовать инициализатор массива.

...