Стиль C ++ з атрибута char без знака * в const char *


80

Я маю:

unsigned char *foo();
std::string str;
str.append(static_cast<const char*>(foo()));

Помилка: invalid static_cast from type ‘unsigned char*’ to type ‘const char*’

Який правильний спосіб перекласти тут у стилі C ++?


3
unsigned char зазвичай використовувався для утримання рядків стилю Unicode, ви впевнені, що хочете безпосередньо передати його, а не перетворити вміст?
Greg Domjan

Відповіді:


48

reinterpret_cast


6
@ jesses.co.tt Дякуємо за голос проти. Ключовою особливістю цього допису, який змушує його проголосувати, є своєчасність. Інші відповіді містять різні деталі, і їх найкраще прочитати та проголосувати окремо. Якщо відповідь @JaredPars охоплює те, що ви шукаєте, я б використав це та / або підтримав би його. Ви зауважите, що я витратив час на вдосконалення формату цих файлів. Я справді не бачу сенсу розширювати цю відповідь, щоб охопити зміст інших.
Ruben Bartelink

3
гаразд, я розумію, що ви тут обгрунтування, і якщо взяти цілу сторінку, я згоден, що не потрібно було переформулювати ... Думаю, важко не поспішати і дивитися на всю сторінку та мітки часу замість судити про кожну відповідь по суті ... але піднятий пункт (особливо у того, хто має в 55 разів більше репутації від мене!)
jesses.co.tt

1
@ jesses.co.tt Не хвилюйтеся, я розумію вашу точку зору, і ви не далеко помиляєтесь. Чесно кажучи, вже давно я не "змагався" у тегах із великим трафіком з такими реакціями, як "швидка зброя на заході". Але ви не отримаєте такого рівня представників, видаливши свою відповідь, навіть якщо це правильно зробити (що в інший день я б так само радісно сперечався!). Правильно, у нас є стіна тексту, що захаращує це місце, тому ваша місія виконана: P
Рубен Бартелінк

23
Мені особливо подобається, як ви так стурбовані криком "ПЕРШИЙ!" що ти навіть не заморочувався basic formatting.
OJFord

8
Це справді марна "відповідь". Він просто не надає інформації.
OYRM

60

char *і const unsigned char *вважаються непов’язаними типами. Отже, ви хочете використовувати reinterpret_cast.

Але якщо ви переходили від const unsigned char*нетипового constтипу, вам потрібно було б використовувати const_castспочатку. reinterpret_castне може відкинути constабо volatileкваліфікацію.


3
"Без зв’язку" тут вводить в оману: створюється враження, що ви не можете справити з одного на іншого. Я читаю проект 2014 року, "3.9.1 Основні типи", і в ньому сказано: "А char, а signed charта unsigned charзаймають однаковий обсяг пам’яті і мають однакову вимогу до вирівнювання". Це Є стосунки. Або ось більш читабельне посилання: en.cppreference.com/w/cpp/language/types#Character_types
Віктор Сергієнко


18

unsigned char * - це в основному байтовий масив і повинен використовуватися для представлення необроблених даних, а не рядка загалом. Рядок унікоду буде представлений як wchar_t *

Згідно зі стандартом C ++, повторне тлумачення_запису між непідписаними символами char * та char * є безпечним, оскільки вони мають однаковий розмір і мають однакову конструкцію та обмеження. Я намагаюся уникати reintrepret_cast навіть більше, ніж const_cast загалом.

Якщо статичний привід не вдається з тим, що ви робите, ви можете переглянути свій дизайн, бо, чесно кажучи, якщо ви використовуєте C ++, ви можете скористатися тим, що пропонує частина "плюс плюс", і використовувати рядкові класи та STL (він же std :: basic_string може працювати краще для вас)


6

Вам потрібно буде використовувати a, reinterpret_cast<>оскільки два типи, які ви проводите, не пов’язані між собою.


6

Забагато коментарів для різних відповідей, тому я залишу тут іншу відповідь.

Ви можете і повинні використовувати reinterpret_cast<>, у вашому випадку

str.append(reinterpret_cast<const char*>(foo()));

тому що, в той час як ці дві різні типи, стандарт 2014 року, глава 3.9.1 Fundamental types [basic.fundamental]каже є відносини між ними:

Звичайна char, signed charі unsigned charтри різних типи, собирательно звані вузькі типажі. A char, a signed charта unsigned charзаймають однаковий обсяг пам’яті та мають однакові вимоги до вирівнювання (3.11); тобто вони мають однакове представлення об’єкта.

(вибір мій)

Ось доступне посилання: https://en.cppreference.com/w/cpp/language/types#Character_types

Використання wchar_tдля Unicode / багатобайтових рядків застаріло: Чи слід використовувати wchar_t під час використання UTF-8?


-4

Сподіваюся, це допоможе. :)

const unsigned attribName = getname();
const unsigned attribVal = getvalue();
const char *attrName=NULL, *attrVal=NULL;
attrName = (const char*) attribName;
attrVal = (const char*) attribVal;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.