我有一个请求sort
的API,这是我的API函数:
char*
此处提供更多信息:https://os.mbed.com/docs/mbed-os/v5.11/mbed-os-api-doxy/classmbed_1_1_c_a_n_message.html
我想从另一个函数中调用此函数,但是我对CANMessage(unsigned _id, const char* _data, char _len = 8)
和强制转换感到困惑。我想从函数const char*
调用此函数,如下所示:
foo()
所以我需要将id,data和len传递给foo函数。我的问题是进入的void foo(unsigned int id, /*???*/ data, char len) {
CANMessage(id, data, len)
}
是data
类型。我得到了uint8_t
的向量,其中第一个元素的地址是我需要传递的地址:
uint8_t
我试图以vector<uint8_t> dta;
的身份通过:&dta[0]
具有foo函数:
foo(idNo, &dta[0], length)
但是我得到“类型为std :: uint8_t的参数与char类型的参数不兼容
调用函数void foo(unsigned int id, uint8_t* data, char len) {
CANMessage(id, (char*)data, len)
}
接受const char*
时,如何将其作为foo
传递?
请注意,我无法更改类型,dta必须保留uint8_t*
。
答案 0 :(得分:2)
std::uint8_t
等于unsigned char
。
这与纯字符或带符号的字符不同,但是它们都是8位,因此在技术上可以强制转换。
通常许多其他需要“缓冲区”的函数在其定义中都使用char*
而不是适当的unsigned char*
。因此,投射很可能是无害的。
在函数实际上需要字符而不是缓冲区的情况下,由于类型不同,您会遇到问题,并且不确定是否会出现问题。
答案 1 :(得分:1)
由于您处于std::uint8_t
可用的环境中,因此char
类型必须最多为8位,但是为了确保您使用的不是7位字符的机器,请添加一个static_assert
。
reinterpret_cast到uint8_t*
的{{1}}和static_cast到const char*
的向量的大小(size_t
)。
char