Proposed platform assumption changes

Nico Williams nico at cryptonector.com
Sun Jan 29 15:17:14 EST 2012


On Fri, Jan 27, 2012 at 5:55 PM,  <ghudson at mit.edu> wrote:
> * Named structure initializers appear to be a favorite C99 feature;
>  we've had three separate cases in the past year of people submitting
>  code using them and having to ask for it to be changed.
>  Unfortunately, it's not supported in MSVC, and there's no pretty way
>  of wrapping them to make it work there.  We could consider changing
>  our Windows build to use mingw, but that would be a lot of work and
>  might present other issues.

I just tried the following macro for dealing with this.  It works, and
in particular cscope finds the initializers when I search by struct
field name -- a critical feature of C99 designated initializers, IMO.
I posted it as an answer on stackoverflow too (I was looking for this,
didn't find it).  This does require building with a C99 compiler for
checking correctness, but MIT krb5 already does that anyways, but a
variant that includes the struct name as a macro argument would allow
for a script to check correctness if that were important.

/*
 * Macro for C99 designated initializer -> C89/90 non-designated initializer
 *
 * Tested.  Works with MSVC if you undefine
HAVE_DESIGNATED_INITIALIZERS.  Cscope also
 * groks this.
 *
 * ("SFINIT" == struct field init, but really, it can be used for
array initializers too.)
 */

#ifdef HAVE_DESIGNATED_INITIALIZERS
#define SFINIT(f, v) f = v
#else
#define SFINIT(f, v) v
#endif

struct t {
    char f1;
    int f2;
    double f3;
};

struct t t = {
    SFINIT(.f1, 'a'),
    SFINIT(.f2, 42),
    SFINIT(.f3, 8.13)
};

Cheers,

Nico
--



More information about the krbdev mailing list