问题 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语法?


3411
2017-08-18 01:33


起源

与铿锵 -Wgnu-designator - Stargateur


答案:


这是gcc和clang支持的指定初始值设定项的GNU扩展,您可以阅读它 在gcc文档中。请注意,这仅适用于初始化程序,而不适用于赋值,这是非常不同的事情,尽管两者都使用了 = 符号。


9
2017-08-18 01:38



这是不正确的,它是C99以来的C标准的一部分。 - Dietrich Epp
@DietrichEpp不,C标准不允许指定初始值设定项中的范围 - Chris Dodd
没关系,我没注意到那一部分。那么可能是一个好主意,以明确你正在谈论的扩展。 - Dietrich Epp
非常感谢!我没有意识到这是在任何规范,因为我不知道该怎么称呼它 - 它有正式名称吗? - PyroAVR