2017-04-08 56 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功能,它可能會或可能不會被編譯器正確支持。