I was examining some code on github https://github.com/umlaeute/v4l2loopback/blob/master/v4l2loopback.c and came across this line, which baffles me. Is this some incredibly cool kernel macro or gcc feature that I don't know about? What does the = -1 do?
static int video_nr[MAX_DEVICES] = { [0 ... (MAX_DEVICES-1)] = -1 };
module_param_array(video_nr, int, NULL, 0444);
MODULE_PARM_DESC(video_nr, "video device numbers (-1=auto, 0=/dev/video0, etc.)");
The line in question is the first, the next two given for context (this is creating a cmdline-specifiable parameter using a kernel macro http://lxr.free-electrons.com/source/include/linux/moduleparam.h#L103 )
Anyway, what is going on with the array initialization? How does that syntax work?
You've found an example of designated initializers.  C99 & C11 don't go quite as far as your example, but they have some pretty flexible support for this kind of behaviour.  Your specific example (using the ...) is a GCC extension.  From the link:
To initialize a range of elements to the same value, write
[first ... last] = value. This is a GNU extension. For example,int widths[] = { [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 };
So that means your example is creating an array of size MAX_DEVICES and initializing every element in that array to -1.
For reference, the only standard-supported behaviour is to assign specific indices, rather than ranges:
[constant-expression] = initializer-value
There is a more complicated example in my copy of the spec:
int a[MAX] = {
            1, 3, 5, 7, 9, [MAX-5] = 8, 6, 4, 2, 0
};
Which initializes the first five and last five elements of the array to explicit values.  The middle values (if any) would be 0.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With