字符串最大长度宏定义不否应该包括结束符零会更自然

场景

C语言中,我们经常会处理字符串,并定义字符串的最大长度宏定义,例如,STR_MAX_LEN

那么,这个最大长度,到底应该是带\0后的长度,还是应该不带\0后的长度呢?

以前总纠结于此,而且体现在代码中也用的比较混乱,并不能一以贯之!

现在来想,如果理清楚这里面的逻辑,就会觉得结论是非常自然的。

信息的长度就是信息的长度,它是第一个先蹦出来的概念,而将此信息用C语言字符串进行处理,才涉及到补零多一个字节的问题。

在其它场合,可能并不涉及这样的问题,所以,你需要知道原始信息的最大长度多少。

另外,用STR_MAX_LEN + 1去表达C语言字符串缓冲区长度,相较于STR_MAX_LEN - 1逆运算获得字符串最大长度,前一个会更直观点,和符合自然的逻辑

结论

定义字符串最大长度,原则上应该是不携带\0的长度。
如果您以C语言的字符串语义去操作这些对象,那么缓冲区长度通常需要定义为STR_MAX_LEN + 1,以足够容纳字符串结束符\0

#define NAME_STR_MAX_LEN (uint16_t)32
#define STR_BUFFER_LEN(STR_MAX_LEN) (STR_MAX_LEN + 1)
...

char szNameBuffer[STR_BUFFER_LEN(NAME_STR_MAX_LEN)];
...

你可能感兴趣的:(笔记,c&c++技术,宏定义,字符串最大长度)