请查看followng头文件
#pragma once
class MissileLauncher
{
public:
MissileLauncher(void);
private:
byte abc[3];
};
这会产生错误
Error 1 error C2143: syntax error : missing ';' before '*'
我试着这样做
byte *abc;
但它也失败了,同样的错误。但是,我注意到我可以用这种方式调用其他内置的tyes数组,例如一个int数组。为什么这会发生在字节数组中?怎么解决这个?我想在cpp文件中分配值。有什么想法吗?
答案 0 :(得分:19)
尝试
class MissileLauncher
{
public:
MissileLauncher(void);
private:
unsigned char abc[3];
};
或
using byte = unsigned char;
class MissileLauncher
{
public:
MissileLauncher(void);
private:
byte abc[3];
};
**注意:在较旧的编译器(非C ++ 11)中,将using
行替换为typedef unsigned char byte;
答案 1 :(得分:13)
如果你只想要一个字节,cstdint中定义的uint8_t将是最具表现力的。
答案 2 :(得分:6)
字节不是C或C ++中的标准类型。尝试char,通常至少8位长。
答案 3 :(得分:6)
也许您可以利用C ++ 11中提供的std::bitset
类型。它可以用来表示N
位的固定序列,可以通过传统逻辑进行操作。
#include<iostream>
#include<bitset>
class MissileLauncher {
public:
MissileLauncher() {}
void show_bits() const {
std::cout<<m_abc[2]<<", "<<m_abc[1]<<", "<<m_abc[0]<<std::endl;
}
bool toggle_a() {
// toggles (i.e., flips) the value of `a` bit and returns the
// resulting logical value
m_abc[0].flip();
return m_abc[0];
}
bool toggle_c() {
// toggles (i.e., flips) the value of `c` bit and returns the
// resulting logical value
m_abc[2].flip();
return m_abc[2];
}
bool matches(const std::bitset<3>& mask) {
// tests whether all the bits specified in `mask` are turned on in
// this instance's bitfield
return ((m_abc & mask) == mask);
}
private:
std::bitset<3> m_abc;
};
typedef std::bitset<3> Mask;
int main() {
MissileLauncher ml;
// notice that the bitset can be "built" from a string - this masks
// can be made available as constants to test whether certain bits
// or bit combinations are "on" or "off"
Mask has_a("001"); // the zeroth bit
Mask has_b("010"); // the first bit
Mask has_c("100"); // the second bit
Mask has_a_and_c("101"); // zeroth and second bits
Mask has_all_on("111"); // all on!
Mask has_all_off("000"); // all off!
// I can even create masks using standard logic (in this case I use
// the or "|" operator)
Mask has_a_and_b = has_a | has_b;
std::cout<<"This should be 011: "<<has_a_and_b<<std::endl;
// print "true" and "false" instead of "1" and "0"
std::cout<<std::boolalpha;
std::cout<<"Bits, as created"<<std::endl;
ml.show_bits();
std::cout<<"is a turned on? "<<ml.matches(has_a)<<std::endl;
std::cout<<"I will toggle a"<<std::endl;
ml.toggle_a();
std::cout<<"Resulting bits:"<<std::endl;
ml.show_bits();
std::cout<<"is a turned on now? "<<ml.matches(has_a)<<std::endl;
std::cout<<"are both a and c on? "<<ml.matches(has_a_and_c)<<std::endl;
std::cout<<"Toggle c"<<std::endl;
ml.toggle_c();
std::cout<<"Resulting bits:"<<std::endl;
ml.show_bits();
std::cout<<"are both a and c on now? "<<ml.matches(has_a_and_c)<<std::endl;
std::cout<<"but, are all bits on? "<<ml.matches(has_all_on)<<std::endl;
return 0;
}
使用gcc 4.7.2进行编译
g++ example.cpp -std=c++11
我明白了:
This should be 011: 011
Bits, as created
false, false, false
is a turned on? false
I will toggle a
Resulting bits:
false, false, true
is a turned on now? true
are both a and c on? false
Toggle c
Resulting bits:
true, false, true
are both a and c on now? true
but, are all bits on? false
答案 4 :(得分:2)
Byte不是C / C ++中的标准数据类型,但它仍然可以按照我想要的方式使用。方法如下:回想一个字节是一个8位的内存大小,可以表示-128和127之间的任何整数,包括端点。 (该范围内有256个整数; 8个位可以表示256个 - 两个上升到8个幂 - 不同的值。)。还记得C / C ++中的char是一个字节(8位)。因此,在C / C ++中使用字节数据类型所需要做的就是将此代码放在源文件的顶部: #define byte char 所以你现在可以宣布 byte abc [3];
答案 5 :(得分:1)
你可以使用Qt,如果你不知道的话,它是带有一堆额外的库和类等的C ++。 Qt有一个非常方便的QByteArray类,我很确定它会满足你的需求。
答案 6 :(得分:-2)
字节不是C / C ++中的标准类型,因此它由char
表示。
这样做的一个优点是您可以将basic_string
视为字节数组,从而实现安全存储和函数传递。这将有助于您避免在使用各种形式的char[]
和char*
时可能遇到的内存泄漏和细分错误。
例如,这会将字符串创建为空值的字节数组:
typedef basic_string<unsigned char> u_string;
u_string bytes = u_string(16,'\0');
这允许使用其他char
值进行标准按位运算,包括存储在其他string
变量中的值。例如,要对char
之间的另一个u_string
的{{1}}值进行XOR:
bytes