Есть ли какое-либо отношение к дополнительной "," в конце инициализации скобки?

Есть ли разница между следующими двумя объявлениями, кроме очевидных - имена:

int main()
{
    char str1[17] = {'H','e','l','l','o'};
    char str2[17] = {'H','e','l','l','o',};
}

Что происходит с дополнительными ',' во втором? Означает ли это что-нибудь вообще?

Оба кажутся компилируемыми просто отлично, и в этом случае они, похоже, производят идентичные строки в соответствии с strcmp, что, по крайней мере, является тем, что я ожидал, так как остальные массивы заполнены нулями.

Ответ 1

Конечная запятая не является специфической для инициализации скобок и является вездесущей среди языков программирования (формат данных JSON является outlier).

За исключением простой генерации машины, одна (небольшая) выгода от трейлайновых запятых - это меньшие различия кода. Если вы измените:

array<string, 20> a = {
    "one",
    "two",
    "three",
};

к

array<string, 20> a = {
    "one",
    "two",
    "three",
    "four",
};

вы получаете только 1 разницу. Если вы опустите необязательную запятую, вам нужно изменить 2 строки, чтобы добавить или удалить последний элемент. Последовательное использование конечной запятой экономит ваши секунды при редактировании и чтении разностей.

Ответ 2

Нет, они полностью эквивалентны. Я полагаю, что конечная запятая разрешена для облегчения машинной генерации массивов в виде исходного кода на С++.