C [x... y] ранжирование

Сегодня я наткнулся на некоторый код, который использовал синтаксис, который в мои годы программирования C я никогда раньше не видел.

MWE:

#include<stdio.h>

char *example_array[] = {
    [0 ... 5] = "hello world",
    [6 ... 10] = "goodbye world"
};

int main(void) {
    printf("%s, %s.\n", example_array[3], example_array[7]);
    return 0;
}

Ожидаемый результат:

hello world, goodbye world.

Это довольно ясно, что происходит здесь в статическом контексте, но мне любопытно, можно ли это использовать в качестве удобного ярлыка в нестатических ярлыках, таких как назначения в цикле. Конечно, это не дало бы никакого повышения производительности, что -funroll-loops не могло, но это могло бы сделать для более чистого кода, например, для присвоений строк матрицы или иным образом.

clang и gcc дают никаких предупреждений по умолчанию при использовании этого синтаксиса, но я никогда не видел его документированным где-либо. Является ли это своего рода расширением, или это стандартный синтаксис C?

Ответы

Ответ 1

Это расширение GNU для назначенных инициализаторов, поддерживаемых как gcc, так и clang, о которых вы можете прочитать в документах gcc. Обратите внимание, что это только для инициализаторов, а не для назначений, которые очень разные, несмотря на то, что оба они используют символ =.