Lucien Brule Lucien Brule - 1 year ago 50
Linux Question

What's the mechanism behind nameless brackets in left hand assignment as seen in initramfs?

I was browsing the Linux source and I came across an unfamiliar piece of code on line 400 of initramfs. I get that the names in the brackets are states from an enum on 188. It also seems to me that this is a default array setting function pointers ( I could be wrong).

I don't understand what the brackets are for, what's an example use case?I also found the equal signs confusing. Additionally, I'd like to know if there's a general name for the pattern the code implements.

static __initdata int (*actions[])(void) = {
[Start] = do_start,
[Collect] = do_collect,
[GotHeader] = do_header,
[SkipIt] = do_skip,
[GotName] = do_name,
[CopyFile] = do_copy,
[GotSymlink] = do_symlink,
[Reset] = do_reset,

Side; Apologies for a naive/general question, I'm trying to broaden my knowledge of C. I searched for and couldn't find a comprehensive commented version of the source in english.

Answer Source

That is a GCC extension for designated initialization.

It's a combination or mixture of standard designated structure/union initialization and array initialization.

To clarify, in the C standard the syntax using square brackets [] is for array initialization, while structure/union initialization uses a dot-syntax. GCC invented their own syntax for structure/union initialization, basing it on the (then proposed) standard array-initialization syntax. This dependency on the GCC C compiler is what makes the Linux kernel hard to port to other compilers. Fortunately (or maybe not) many compilers try to make themselves compatible with GCC, including extensions like that.