Я хочу массив двоичных сообщений в моем коде как литералы. Сообщения довольно смахивают, поэтому я подумал, что проще всего использовать «двоичные» литералы. Но как это сделать?Как создать массив бинарных литералов
Я попробовал этот код:
struct binary_message
{
binary_message(int size, unsigned char* bytes) : size_(size), bytes_(bytes) {}
int size_;
unsigned char* bytes_;
};
binary_message messages[] = {
{ 3, { 0x1, 0x2, 0x3 } },
{ 2, { 0x1, 0x2 } },
{ 1, { 0x1 } }
};
с Visual Studio 2013 C++ компилятор, который я получаю ошибку:
error C2440: 'initializing' : cannot convert from 'initializer-list' to 'binary_message'. No constructor could take the source type, or constructor overload resolution was ambiguous
С г ++ я получаю:
>g++ main.cpp
main.cpp:13:1: warning: extended initializer lists only available with -std=c++0x or -std=gnu++0x [enabled by default]
main.cpp:13:1: warning: extended initializer lists only available with -std=c++0x or -std=gnu++0x [enabled by default]
main.cpp:13:1: warning: extended initializer lists only available with -std=c++0x or -std=gnu++0x [enabled by default]
main.cpp:13:1: error: could not convert '{3, {1, 2, 3}}' from '<brace-enclosed initializer list>' to 'binary_message'
main.cpp:13:1: error: could not convert '{2, {1, 2}}' from '<brace-enclosed initializer list>' to 'binary_message'
main.cpp:13:1: error: invalid conversion from 'int' to 'unsigned char*' [-fpermissive]
main.cpp:4:2: error: initializing argument 2 of 'binary_message::binary_message(int, unsigned char*)' [-fpermissive]
, если я использую г ++ -std = C++ 0x main.cpp Я все еще получаю:
main.cpp:13:1: error: could not convert '{3, {1, 2, 3}}' from '<brace-enclosed initializer list>' to 'binary_message'
main.cpp:13:1: error: could not convert '{2, {1, 2}}' from '<brace-enclosed initializer list>' to 'binary_message'
main.cpp:13:1: error: invalid conversion from 'int' to 'unsigned char*' [-fpermissive]
main.cpp:4:2: error: initializing argument 2 of 'binary_message::binary_message(int, unsigned char*)' [-fpermissive]
Как исправить это?
UPDATE
Я думаю, вы имеете в виду что-то вроде этого?
#include <vector>
#include <iostream>
struct binary_message
{
binary_message(std::initializer_list<unsigned char> data) : bytes_(data) {}
std::vector<unsigned char> bytes_;
};
int main()
{
binary_message messages[] = {
{ 0x1, 0x2, 0x3 },
{ 0x1, 0x2 },
{ 0x1 }
};
binary_message msg1 = messages[0];
return 0;
}
Бинарные литералы - это настоящая вещь с C++ 14 и выглядят как '0b100110' - если это не то, что вы имеете в виду, возможно, вам следует уточнить, что вы хотите сделать. – melak47
Вы используете комбинацию десятичных литералов (например, «3») и шестнадцатеричных литералов (например, «0x3»). Но представляете ли вы эти целочисленные значения как десятичные, шестнадцатеричные, восьмеричные, двоичные и т. Д., Они все равно являются числами для компилятора. Во время выполнения нет оптимизации, которая соответствует этому представлению. –
С 'const' вы можете сделать что-то вроде' '\ x01 \ x02 \ x03" ' – Jarod42