2017-04-08 57 views
3

我只注意到在C++ 17C + + 17中的std :: byte与C#中的byte相当吗?

std::byte我问这个问题,因为我用下面的代码的字节数组发送到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) 

在C++ 17的新byte类型,它看起来像我可能能够做到这一点现在:

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呢。

那么,在C++中是std::byte在C++ 17中相当于byte?是否有理由不使用std::byte而不是unsigned char*

+0

值得一读http://stackoverflow.com/questions/43143318/stdbyte-on-odd-platforms。它从奇怪的平台开始,但答案涵盖了所有的基础知识。 –

+0

C#**要求**字节正好是8位,但如果您正在互操作C++和C#,则可以放心地假设C++也在使用8位字节 – MSalters

回答

1

According to C++ reference

像字符类型(字符,无符号字符,符号字符)std::byte可用于访问被其它对象占用原始内存。

这告诉我,你可以自由地

unsigned char audioBytes[] 

std::byte audioBytes[] 
在函数头

代替,一切都去上班,只要你打算把字节字节,而不是数字对象。

+0

考虑到微软使其编译器符合C和C++标准,使用'std :: byte'与C#进行互操作的问题在相当长的时间内仍然是一个纯粹的理论主题。 – dasblinkenlight

+0

我会将字节视为字节,这听起来很有希望。我会尽我所能修改我的代码,并在支持字节的GCC编译器上测试它,并会在今天更新。 – Programmer

1

std::byte在C++中相当于unsigned charchar,因为它是表示1字节原始存储器的类型。

如果您在界面中使用了unsigned char*,则可以用std::byte轻松替换它。

在你的C#代码,这将导致没有任何变化可言,在C++侧这会让你的类型系统更加严格(这是一件好事),由于这样的事实,你将不能够把你的std::byte s作为文本字符或小整数。

当然,这是C++ 17功能,它可能会或可能不会被编译器正确支持。