Это позволяет защитить от ошибок, вызванных перемещением элементов в длинном списке.
Например, предположим, что у нас есть код, похожий на этот.
#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», но наш компилятор утверждает, что он существует.Теперь проблема в том, что в С есть функция конкатенации строк, которая позволяет вам писать две строки в двойных кавычках и конкатенировать их, не используя ничего (аналогичная проблема может возникнуть и с целыми числами, поскольку знак -
имеет несколько значений).1017 * А что если исходный массив имеет бесполезную запятую в конце?Ну, линии будут перемещаться, но такой ошибки не было бы.Легко пропустить что-то такое маленькое, как запятая.Если вы не забыли ставить запятую после каждого элемента массива, такой ошибки просто не может быть.Вы не захотите тратить четыре часа на отладку чего-либо, пока не обнаружите, что причиной ваших проблем является запятая .