Andrii Nakryiko <andriin@xxxxxx> writes: > LIBBPF_OPTS is implemented as a mix of field declaration and memset > + assignment. This makes it neither variable declaration nor purely > statements, which is a problem, because you can't mix it with either > other variable declarations nor other function statements, because C90 > compiler mode emits warning on mixing all that together. > > This patch changes LIBBPF_OPTS into a strictly declaration of variable > and solves this problem, as can be seen in case of bpftool, which > previously would emit compiler warning, if done this way (LIBBPF_OPTS as > part of function variables declaration block). > > This patch also renames LIBBPF_OPTS into DECLARE_LIBBPF_OPTS to follow > kernel convention for similar macros more closely. > > v1->v2: > - rename LIBBPF_OPTS into DECLARE_LIBBPF_OPTS (Jakub Sitnicki). > > Signed-off-by: Andrii Nakryiko <andriin@xxxxxx> Acked-by: Toke Høiland-Jørgensen <toke@xxxxxxxxxx> > +#define DECLARE_LIBBPF_OPTS(TYPE, NAME, ...) \ > + struct TYPE NAME = ({ \ > + memset(&NAME, 0, sizeof(struct TYPE)); \ > + (struct TYPE) { \ > + .sz = sizeof(struct TYPE), \ > + __VA_ARGS__ \ > + }; \ > + }) Found a reference with an explanation of why this works, BTW; turns out it's a GCC extension: http://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html#Statement-Exprs -Toke