[PATCH] cli: use designated initializers for opt desc

Tomi Ollila tomi.ollila at iki.fi
Sun Oct 1 11:29:54 PDT 2017


On Sun, Oct 01 2017, Jani Nikula wrote:

> Several changes at once, just to not have to change the same lines
> several times over:
>
> - Use designated initializers to initialize opt desc arrays.
>
> - Only initialize the needed fields.
>
> - Remove arg_id (short options) as unused.
>
> - Replace opt_type and output_var with several type safe output
>   variables, where the output variable being non-NULL determines the
>   type. Introduce checks to ensure only one is set. The downside is
>   some waste of const space per argument; this could be saved by
>   retaining opt_type and using a union, but that's still pretty
>   verbose.
>
> - Fix some variables due to the type safety. Mostly a good thing, but
>   leads to some enums being changed to ints. This is pedantically
>   correct, but somewhat annoying. We could also cast, but that defeats
>   the purpose a bit.
>
> - Terminate the opt desc arrays using {}.
>
> The output variable type safety and the ability to add new fields for
> just some output types or arguments are the big wins. For example, if
> we wanted to add a variable to set when the argument is present, we
> could do so for just the arguments that need it.
>
> Beauty is in the eye of the beholder, but I think this looks nice when
> defining the arguments, and reduces some of the verbosity we have
> there.

Good stuff. It just doesn't longer compile on older compilers (so some
note on commit message should be added):

CC  -g -O2 notmuch.o
notmuch.c:53: error: unknown field ‘opt_bool’ specified in initializer
notmuch.c:53: warning: missing braces around initializer
notmuch.c:53: warning: (near initialization for
‘notmuch_shared_options[0].<anonymous>’)
notmuch.c:53: warning: initialization from incompatible pointer type
notmuch.c:53: warning: missing initializer
notmuch.c:53: warning: (near initialization for
‘notmuch_shared_options[0].<anonymous>.opt_bool’)
notmuch.c:54: error: unknown field ‘opt_bool’ specified in initializer
notmuch.c:54: warning: initialization from incompatible pointer type
notmuch.c:54: warning: missing initializer
notmuch.c:54: warning: (near initialization for
‘notmuch_shared_options[1].<anonymous>.opt_bool’)
notmuch.c:55: error: unknown field ‘opt_string’ specified in initializer
notmuch.c:55: warning: initialization from incompatible pointer type
notmuch.c:55: warning: missing initializer
notmuch.c:55: warning: (near initialization for
‘notmuch_shared_options[2].<anonymous>.opt_bool’)
notmuch.c:56: warning: missing initializer
notmuch.c:56: warning: (near initialization for
‘notmuch_shared_options[3].<anonymous>’)
notmuch.c: In function ‘notmuch_minimal_options’:
notmuch.c:85: error: unknown field ‘opt_inherit’ specified in initializer
notmuch.c:85: warning: missing braces around initializer
notmuch.c:85: warning: (near initialization for ‘options[0].<anonymous>’)
notmuch.c:85: warning: missing initializer
notmuch.c:85: warning: (near initialization for
‘options[0].<anonymous>.opt_bool’)
notmuch.c:86: warning: missing initializer
notmuch.c:86: warning: (near initialization for ‘options[1].<anonymous>’)
notmuch.c: In function ‘main’:
notmuch.c:414: error: unknown field ‘opt_string’ specified in initializer
notmuch.c:414: warning: missing braces around initializer
notmuch.c:414: warning: (near initialization for ‘options[0].<anonymous>’)
notmuch.c:414: warning: initialization from incompatible pointer type
notmuch.c:414: warning: missing initializer
notmuch.c:414: warning: (near initialization for
‘options[0].<anonymous>.opt_bool’)
notmuch.c:415: error: unknown field ‘opt_inherit’ specified in initializer
notmuch.c:415: warning: missing initializer
notmuch.c:415: warning: (near initialization for
‘options[1].<anonymous>.opt_bool’)
notmuch.c:416: warning: missing initializer
notmuch.c:416: warning: (near initialization for ‘options[2].<anonymous>’)
make: *** [notmuch.o] Error 1

gcc version 4.4.6 20110731 (Red Hat 4.4.6-3) (GCC) 

This was on Scientific Linux 6.2 -- will test on CentOS 7 (which IIRC has
gcc 4.8) container soon...


Tomi


More information about the notmuch mailing list