Проблема при использовании типа созданного typedef среди аргументов функции
Вот код:
//Crypto.h
typedef uint8_t IV[16];
class AES {
private:
IV iv;
public:
void setIV(IV iv);
}
//Crypto.cpp
void AES::setIV(IV iv) {
this->iv = iv;
}
При компиляции появляется ошибка:
src\Crypto.cpp: In member function 'void AES::setIV(uint8_t*)':
src\Crypto.cpp:25:14: error: incompatible types in assignment of 'uint8_t* {aka unsigned char*}' to 'IV {aka unsigned char [16]}'
this->iv = iv;
Как отключить преобразование типов в аргументах функции? Или есть другой вариант создания типа IV на основе массива uint_8[16] (он же byte[16]), не преобразующегося в uint8_t* в аргументе функции?
Upd 20200120 14:13.
Основное требования к вектору инициализации (IV) согласно стандарту AES (режим CBC) заключается в длине этого вектора, которая должна быть равна размеру блока (в AES - 128 бит). Поэтому в идеале нужно, что бы в функцию нельзя было передавать массив произвольной длины (для этого и создаю тип IV на основе массива размером 16 байт). Насчёт присваивания массива: да, я в курсе, что так делать не стоит (причина - хотел показать, что в аргументе преобразуется массив фиксированного размера в указатель, от чего я и хочу избавиться).
P.S. Вопрос закрою завтра, если не найдётся гений, что сможет придумать фантастическое решение проблемы.
Ответы (1 шт):
Структура имеет способность полного копирования, и в адрес автоматически не преобразовывается.
struct IV {
uint8_t a[16];
} ;
// ..
IV a ;
// полное копирование
IV b = a;
// адрес структуры
IV * p = & a ;
// адрес массива
uint8_t * pa = a . a ;