qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH 04/14] qlit: remove needless type cast


From: Markus Armbruster
Subject: Re: [Qemu-devel] [PATCH 04/14] qlit: remove needless type cast
Date: Fri, 25 Aug 2017 08:20:29 +0200
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/25.2 (gnu/linux)

Marc-André Lureau <address@hidden> writes:

> And misc code style fix.
>
> Signed-off-by: Marc-André Lureau <address@hidden>
> ---
>  include/qapi/qmp/qlit.h | 8 ++++----
>  1 file changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/include/qapi/qmp/qlit.h b/include/qapi/qmp/qlit.h
> index f36bca4554..1e9696988a 100644
> --- a/include/qapi/qmp/qlit.h
> +++ b/include/qapi/qmp/qlit.h
> @@ -36,13 +36,13 @@ struct QLitDictEntry {
>  };
>  
>  #define QLIT_QNUM(val) \
> -    (QLitObject){.type = QTYPE_QNUM, .value.qnum = (val)}
> +    { .type = QTYPE_QNUM, .value.qnum = (val) }
>  #define QLIT_QSTR(val) \
> -    (QLitObject){.type = QTYPE_QSTRING, .value.qstr = (val)}
> +    { .type = QTYPE_QSTRING, .value.qstr = (val) }
>  #define QLIT_QDICT(val) \
> -    (QLitObject){.type = QTYPE_QDICT, .value.qdict = (val)}
> +    { .type = QTYPE_QDICT, .value.qdict = (val) }
>  #define QLIT_QLIST(val) \
> -    (QLitObject){.type = QTYPE_QLIST, .value.qlist = (val)}
> +    { .type = QTYPE_QLIST, .value.qlist = (val) }
>  
>  int compare_litqobj_to_qobj(QLitObject *lhs, QObject *rhs);

Technically, this isn't a type cast, it's a compound literal.  A
compound literal is "an unnamed object whose value is given by the
initializer list" (C99 §6.5.2.5).  The standard then cautions "that this
differs from a cast expression" (ibid).

The previous paragraph probably makes sense only to language-lawyers, so
let's consider an example.

The macro

   #define QLIT_QSTR(val) \
       (QLitObject){.type = QTYPE_QSTRING, .value.qstr = (val)}

expands into a compound literal of type QLitObject, which can be used as
an initializer for a variable of type QLitObject.

The macro

   #define QLIT_QSTR(val) \
       { .type = QTYPE_QSTRING, .value.qstr = (val) }

expands into something that can be used as an initializer for a variable
of *any* structure type with suitable members.  Duck typing, if you
will.

The original author's choice of compound literals is clearly
intentional.  I'd prefer to respect it unless there's a compelling
reason not to.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]