>> Here are two alternative approaches [...]

>> 1. C99 initializers:
>> 
>>      config_found(self, whatever, (const struct cfargs *){
>>          .search = ...,
>>          .locators = ...,
>>      })

That's not how C99 compound literals work.  That creates an anonymous
const struct cfargs * (ie, a pointer object) but then tries to
initialize it as if it instead were the struct it points to.  What you
probably want is more like

        config_found(self,whatever,&(const struct cfargs){
                ...
        });

but you have to be aware that the anonymous const struct cfargs "has
automatic storage duration associated with the enclosing block"; it
goes away once the block exits.  Provided nobody saves pointers to the
struct cfargs or any of its components, this is fine, but I haven't
read the relevant code, so I don't know whether that's so.

There *is* an example (6.5.2.5 [#11]) that applies & to a compound
literal of struct type

       [#11]  EXAMPLE 3 Initializers  with  designations   can   be
       combined  with compound literals.  Structure objects created
       using compound literals can be passed to  functions  without
       depending on member order:

               drawline((struct point){.x=1, .y=1},
                       (struct point){.x=3, .y=4});

       Or, if drawline instead expected pointers to struct point:

               drawline(&(struct point){.x=1, .y=1},
                       &(struct point){.x=3, .y=4});

so I'm reasonably sure that has to work in C99.

If you want it to have static storage duration, I know of no way to do
that in C short of declaring a variable.  It can be done in gcc with a
statement expression

        config_found(..., ({ static const struct cfargs foo = { ... }; &foo; 
}));

but I don't know how widely supported that particular extension is, and
I seem to recall seeing it said in some form that depending on gcc-only
features was frowned upon.  However, I see little reason to do the
statement expression rather than

        { static const struct cfargs foo = { ... };
          config_found(..., &foo);
        }

/~\ The ASCII                             Mouse
\ / Ribbon Campaign
 X  Against HTML                [email protected]
/ \ Email!           7D C8 61 52 5D E7 2D 39  4E F1 31 3E E8 B3 27 4B

Reply via email to