我最近听说在某些情况下,程序员认为你永远不应该在代码中使用文字。我知道在某些情况下,将变量名称分配给给定的数字可能会有所帮助(特别是在维护方面,如果该数字在其他地方使用)。但是,请考虑以下案例研究:
案例研究 1:将文字用于“特殊”字节码。
假设您有一个 if 语句检查存储在(为了论证) a 中的特定值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
}
就良好的编码实践而言,哪种方法是“首选”方法?kSuperDescriptiveVarName
如果多次使用,我完全可以理解为什么您更喜欢版本 2 。此外,编译器是否进行任何优化以使两个版本有效地成为相同的可执行代码?也就是说,这里有任何性能影响吗?
案例研究 2:使用sizeof
我完全理解,出于可移植性和可读性的考虑,使用 sizeof 与原始文字相比是首选。考虑这两个代码示例。场景是您正在计算数据包缓冲区(一个数组uint8_t
)中的偏移量,其中数据包的第一部分存储为my_packet_header
,假设是 a 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);
版本 2:
const int offset = 47;
在这种情况下哪个是首选?显示计算偏移量所涉及的所有步骤是否仍然有意义,或者文字用法在这里有意义吗?
在我尝试改进我的代码实践时提前感谢您的帮助。