Некоторый адрес состоит из 3 байт. Можно ли сделать тип, состоящий из трёх байт?
Если этот некоторый адрес передаётся в функцию в виде u32, то приходится в функции проверять, что старший байт равен нулю. Лучше бы функция ругалась в момент передачи неправильного типа, если бы его можно было сделать каким-то образом.
Дмитрий: Ок. Положим, вы работаете с некоторым устройством. И по некоторому адресу в это устройство отправляете данные с помощью некоторой функции.
Теперь представим, что вы забыли, что максимальное значение адреса 0x00FFFFFF. И отправили данные по адресу 0x0FFFFFFF. Что делать в такой ситуации?
Евгений Шатунов: Потому что пользователь этой функции не заметит, что он ошибся с адресом, и будет думать, что он отправил данные, хотя на самом деле - нет.
и будет думать, что он отправил данные, хотя на самом деле - нет.
Это потому что сейчас ты все еще думаешь мусорным 4м байтом.
Я же спрашиваю, почему безусловное маскирование первых трех байт невыгодно. Почему примесь 4го байта так важно помечать ошибкой? При том, такой серьезной и многозатратной, как исключение. Разве устройство не оповестит о недействительном адресе?
В целом-то, вариант Антона самый разумный. Его пример грязноват, explicit лишний для этого случая и struct не struct, но решение показывает идеально.
Буквально, его код сделает все точно то же самое, что ты сейчас делаешь в теле своей функции, только за тебя и автоматически. Все остальное останется так же как у тебя сейчас.
Вот аналог GSL not_null : https://github.com/Microsoft/GSL/blob/247c4250d40d... https://github.com/isocpp/CppCoreGuidelines/blob/m...
Евгений Шатунов: Устройство не оповестит о недействительном адресе, потому что оно работает с трёхбайтовыми адресами. Соответственно четвёртый байт оно как байт адреса вообще не воспримет или воспримет как что-нибудь другое.