如果存在要包含的头文件?
此代码提供编译错误:
#include <iostream>
using namespace std;
int main()
{
byte b = 2;
cout << b << endl;
return 0;
}
答案 0 :(得分:76)
不,C ++中没有名为“byte
”的类型。您想要的是unsigned char
(或者,如果您需要8位,uint8_t
来自<cstdint>
,since C++11)。请注意,char
不一定是准确的替代方案,因为它在某些编译器上是signed char
,在其他编译器上是unsigned char
。
答案 1 :(得分:27)
答案 2 :(得分:26)
C ++中没有字节数据类型。但是,您始终可以包含标准库中的bitset标头,并为byte创建typedef:
typedef bitset<8> BYTE;
注意:鉴于WinDef.h为Windows代码定义了BYTE,如果您打算以Windows为目标,则可能需要使用BYTE之外的其他内容。
编辑:回答有关答案错误的建议。 答案没错。问题是“C ++中是否存在'字节'数据类型?”。答案是并且是:“没有C ++中没有字节数据类型”作为回答。
关于建议的可能替代方案,为什么建议的替代方案更好?
根据我的C ++标准副本,当时:
“声明为字符(char)的对象应足够大,以存储实现基本字符集的任何成员”:3.9.1.1
我读到这一点建议如果编译器实现需要16位来存储基本字符集的成员,那么char的大小将是16位。今天的编译器倾向于使用8位来表示char是一回事,但据我所知,肯定不能保证它是8位。
另一方面,“类模板位集&lt; N&gt;描述了可以存储由固定位数N组成的序列的对象。” :20.5.1。换句话说,通过将8指定为模板参数,我得到一个可以存储由8位组成的序列的对象。
在编写程序的上下文中,替代方法是否更好于char,因此,据我所知,虽然我可能错了,但是根据您的编译器和您当时的要求。因此,就我而言,编写代码的个人应该确定建议的替代方案是否适合他们的要求/需求。
答案 3 :(得分:22)
如果你使用的是Windows,你可以在WinDef.h中找到:
typedef unsigned char BYTE;
答案 4 :(得分:20)
使用C++11
,手动定义的字节类型有一个很好的版本:
enum class byte : std::uint8_t {};
这至少是GSL的作用。
从C++17
开始(几乎)这个版本在标准中被定义为std::byte
(感谢Neil Macintosh两者)。
答案 5 :(得分:2)
不,但是因为C ++ 11有[u]int8_t。
答案 6 :(得分:1)
namespace std
{
// define std::byte
enum class byte : unsigned char {};
};
如果您的C ++版本没有std :: byte,则它将在命名空间std中定义字节类型。通常您不想在std中添加内容,但是在这种情况下 这是标准的东西,不见了。
STL中的std :: byte执行更多操作。
答案 7 :(得分:0)
还有http://microsoft.public.de.german.entwickler.dotnet.csharp.narkive.com/g9rTQP1U/c-dll-in-c-nutzen#post9,与C ++ 98,C ++ 11及更高版本兼容。