2016-01-19 11 views
1

Я работаю в устаревшей кодовой базе, которая использовала unsigned char* s, чтобы содержать строки. Для моей функциональности я использовал string с, но есть руб:Является ли законным лишить знак на указателе?

Я ничего не могу использовать в #include <cstring> в старом коде. Копирование с string на unsigned char* трудоемкий процесс:

unsigned char foo[12]; 
string bar{"Lorem Ipsum"}; 

transform(bar.cbegin(), bar.cbegin() + min(sizeof(foo)/sizeof(foo[0]), bar.size()), foo, [](auto i){return static_cast<unsigned char>(i);}); 
foo[sizeof(foo)/sizeof(foo[0]) - 1] = '\0'; 

Я собираюсь попасть в неопределенное поведение или алиасов проблемы, если я просто делаю:

strncpy(reinterpret_cast<char*>(foo), bar.c_str(), sizeof(foo)/sizeof(foo[0]) - 1); 
foo[sizeof(foo)/sizeof(foo[0]) - 1] = '\0'; 
+0

Вам нужна кросс-платформа здесь? Готовы ли вы согласиться на то, что работает на вашей нынешней платформе, даже если это может быть UB в стандарте C++? 'char' гарантированно будет иметь такое же представление, как один из' signed char' или 'unsigned char', и даже в случае' signed', вы, вероятно, будете безопасны со строго данными ACSII: '[0,127]'. – BoBTFish

+0

@BeyelerStudios Это ASCII. –

+0

Должно ли это быть 'static_cast или просто в стиле c? –

ответ

2

Существует явное исключение к строгое правило псевдонимов для [unsigned] char, поэтому указатели на заливку между типами символов будут работать.

В частности, в N3690 [basic.types] говорит, что любой объект тривиальных копируемый может быть скопирован в массив char или unsigned char, и если затем копируется обратно значение идентично. Он также говорит, что если вы копируете один и тот же массив во второй объект, два объекта идентичны. (Параграфы 2 и 3)

[basic.lval] говорит, что законно изменять объект с помощью lvalue char или .

Озабоченность, выраженная BobTFish в комментариях о том, являются ли значения в char инеуместными, я думаю. Значения «Знак» по своей сути относятся к типу char. Вы можете сохранить их в unsigned char и использовать их как char позже - но это уже происходило.

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

Редактировать: Удалить ошибочными рекомендуется использовать static_cast.

Редактировать2: Глава и стих.

+1

Вы не можете сделать 'static_cast ', как указано здесь: http://stackoverflow.com/questions/34878710/is-it-legal-to-cast-away-the-sign-on-a-pointer # comment57495575_34878710 –

+1

Назовите меня скептиком, но я бы хотел увидеть источник этого, особенно после всего 'static_cast' фиаско , –

+1

Yup. Пила ваш комментарий выше и меняла свой ответ (перед тем, как появился ваш комментарий!) –