gpt4 book ai didi

c++ - 在 C++11 中声明 char 十六进制常量

转载 作者:可可西里 更新时间:2023-11-01 18:36:01 25 4
gpt4 key购买 nike

在我们代码的各种低级部分,我们需要将特定字节发送到设备以使事情发生。因此,我们有很多代码如下所示:

const char magic_bytes[] = { 0x01, 0xFA, 0x92 };

导致错误(在 GCC 4.7.2 上)

test_char.cpp:6:51: warning: narrowing conversion of ‘250’ from ‘int’ to ‘const char’ inside { } is ill-formed in C++11 [-Wnarrowing]

因为 0xFA 超出了 -128 到 127 的范围。

我可以想到两种解决方法:

const char magic_bytes[] = { static_cast<char>(0x01), static_cast<char>(0xFA), static_cast<char>(0x92) };

或:

const unsigned char magic_bytes[] = { 0x01, 0xFA, 0x92 };

两者要么都很丑(第一种情况),要么有其他缺点(在后者的情况下必须转换为 (const char*))

有没有更好的方法来声明这些字符串?

最佳答案

C++11 给你 variadic templates (GCC 支持已经存在了一段时间)来解决这个问题。

template <typename... A>                                                                 
constexpr std::array<char, sizeof...(A)> byte_array(A... v)
{ return std::array<char, sizeof...(A)>{{static_cast<char>(v)...}}; }

constexpr auto arr = byte_array( 0x01, 0xFA, 0x92 );

或者为了避免重复调用 .data() 以将其传递给 C 函数:

template <std::size_t S>
struct byte_array {
char data_[S];
char *data() { return data_; }
operator char*() { return data_; }

const char *data() const { return data_; }
operator const char*() const { return data_; }

constexpr std::size_t size() const { return S; }

// one could add support for begin/end and things like that
};

template <typename... A>
constexpr byte_array<sizeof...(A)> make_byte_array(A... v)
{ return byte_array<sizeof...(A)>{{static_cast<char>(v)...}}; }

// beside constexpr, this can be also non-const
auto magic_bytes = make_byte_array( 0x01, 0xFA, 0x92 );
strtok(magic_bytes, "why?");

与普通的 char 数组相比没有开销。

关于c++ - 在 C++11 中声明 char 十六进制常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15695960/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com