这样可以防止因在长列表中四处移动元素而导致的错误。
例如,假设我们有一个看起来像这样的代码。
#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具有字符串连接功能,该功能使您可以编写两个双引号字符串并不使用它们进行连接(整数也可能发生类似的问题,因为-
符号具有多种含义)。
现在,如果原始数组结尾处没有逗号,该怎么办?好吧,这些线会四处移动,但是这种错误不会发生。容易错过像逗号这样的小东西。如果您记得在每个数组元素后都添加逗号,那么这种错误就不会发生。在发现逗号是造成问题的原因之前,您不会希望花费四个小时来调试某些内容。
;
当清楚知道下一个标记实际上是下一个语句时,他们为什么不忽略缺失。