Является ли std :: byte в C ++ 17 эквивалентным байту в C #?

Я только заметил std::byte в С ++ 17.

Я задаю этот вопрос, потому что я использую приведенный ниже код для отправки массива байтов в C ++ для воспроизведения звука.

C #:

[DllImport ("AudioStreamer")]
public static extern void playSound (byte[] audioBytes);

C ++:

#define EXPORT_API __declspec(dllexport)
extern "C" void EXPORT_API playSound(unsigned char* audioBytes)

С новым byte введите в C ++ 17, похоже, я может быть быть в состоянии сделать это сейчас:

C #:

[DllImport ("AudioStreamer")]
public static extern void playSound (byte[] audioBytes);

C ++:

#define EXPORT_API __declspec(dllexport)
extern "C" void EXPORT_API playSound(byte[] audioBytes)

Я не уверен, будет ли это работать, потому что компилятор, который я использую, не поддерживает byte в C ++ 17 пока нет.

Итак, это std::byte в C ++ 17 эквивалентно byte в C #? Есть ли причина не использовать std::byte над unsigned char* ?

3

Решение

Согласно справке C ++,

Как и типы символов (символ, символ без знака, знак с символом) std::byte может использоваться для доступа к необработанной памяти, занятой другими объектами.

Это говорит мне, что вы можете свободно заменить

unsigned char audioBytes[]

с

std::byte audioBytes[]

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

1

Другие решения

std::byte эквивалентно обоим unsigned char а также char в C ++ в том смысле, что это тип для представления 1 байта необработанной памяти.

Если вы использовали unsigned char* в своем интерфейсе вы можете легко заменить его на std::byte,

В вашем коде на C # это вообще не приведет к изменениям, на стороне C ++ это сделает вашу систему типов более строгой (что хорошо) из-за того, что вы не сможете обрабатывать свои std::bytes как текстовые символы или как маленькие целые числа.

Конечно, это функция C ++ 17, которая может или не может должным образом поддерживаться вашим компилятором.

1