Я недавно слышал, что в некоторых случаях программисты считают, что вы никогда не должны использовать литералы в своем коде. Я понимаю, что в некоторых случаях назначение имени переменной для данного номера может быть полезным (особенно с точки зрения обслуживания, если это число используется в другом месте). Однако рассмотрим следующие тематические исследования:Использование литералов, yay/nay в C++
Пример 1: Использование литералов для «специальных» байтовых кодов.
Скажите, что у вас есть оператор if, который проверяет определенное значение, хранящееся (для аргумента), uint16_t
. Вот образцы два кода:
Версия 1:
// Descriptive comment as to why I'm using 0xBEEF goes here
if (my_var == 0xBEEF) {
//do something
}
Версия 2:
const uint16_t kSuperDescriptiveVarName = 0xBEEF;
if (my_var == kSuperDescriptiveVarName) {
// do something
}
Что является "предпочтительным" метод с точки зрения хорошей практики кодирования? Я могу полностью понять, почему вы предпочитаете версию 2, если kSuperDescriptiveVarName
используется более одного раза. Кроме того, делает ли компилятор какие-либо оптимизации, чтобы обе версии имели одинаковый исполняемый код? То есть, есть ли последствия для производительности здесь?
Пример 2: Использование sizeof
Я полностью понимаю, что с помощью SizeOf по сравнению с сырым буквальным является предпочтительным для портативности и также читаемость проблем. Учитывайте два примера кода. Сценарий заключается в том, что вы вычисляете смещение в буфере пакетов (массив uint8_t
), где первая часть пакета хранится как my_packet_header
, что, скажем, uint32_t
.
Версия 1:
const int offset = sizeof(my_packet_header);
Версия 2:
const int offset = 4; // good comment telling reader where 4 came from
Очевидно, что версия 1 является предпочтительным, но что в случаях, когда у вас есть несколько полей данных, чтобы пропустить? Что делать, если у вас есть следующие вместо:
Версия 1:
const int offset = sizeof(my_packet_header) + sizeof(data_field1) + sizeof(data_field2) + ... + sizeof(data_fieldn);
Version 2:
const int offset = 47;
Что является предпочтительным в этом случае? Имеет ли смысл показать все шаги, связанные с вычислением смещения, или имеет ли смысл буквальное использование здесь?
Благодарим за помощь заранее, пытаясь улучшить мои правила использования кода.
Причина для меня: предположим, что вы хотите использовать 0xBEEF в более чем одном месте, которое вам нужно было бы скопировать-вставить, что почти всегда является признаком нарушения DRY. Если вы используете константу вместо этого, вы просто повторно используете константу, и на данный момент вы меняете BEEF на DEADBEEF, все довольны, так как они получают обновленное значение (за исключением говядины с тех пор, теперь он мертв :) – stijn