这可以防止由于在长列表中移动元素而导致的错误。
例如,假设我们有一个看起来像这样的代码。
#include <iostream>
#include <string>
#include <cstddef>
#define ARRAY_SIZE(array) (sizeof(array) / sizeof *(array))
int main() {
std::string messages[] = {
"Stack Overflow",
"Super User",
"Server Fault"
};
size_t i;
for (i = 0; i < ARRAY_SIZE(messages); i++) {
std::cout << messages[i] << std::endl;
}
}
它很棒,因为它展示了 Stack Exchange 网站的原始三部曲。
Stack Overflow
Super User
Server Fault
但它有一个问题。你看,这个网站的页脚显示超级用户之前的服务器故障。最好在任何人注意到之前解决这个问题。
#include <iostream>
#include <string>
#include <cstddef>
#define ARRAY_SIZE(array) (sizeof(array) / sizeof *(array))
int main() {
std::string messages[] = {
"Stack Overflow",
"Server Fault"
"Super User",
};
size_t i;
for (i = 0; i < ARRAY_SIZE(messages); i++) {
std::cout << messages[i] << std::endl;
}
}
毕竟,移动线条并没有那么难,不是吗?
Stack Overflow
Server FaultSuper User
我知道,没有名为“Server FaultSuper User”的网站,但我们的编译器声称它存在。现在,问题在于 C 具有字符串连接功能,它允许您编写两个双引号字符串并使用任何内容连接它们(整数也可能发生类似问题,因为-
符号具有多种含义)。
现在,如果原始数组末尾有一个无用的逗号怎么办?好吧,线条会移动,但不会发生这样的错误。很容易错过像逗号这样小的东西。如果你记得在每个数组元素后加一个逗号,这样的错误就不会发生。你不会想浪费四个小时调试一些东西,直到你发现逗号是你的问题的原因。