From: Eric Blake <eblake@redhat.com>
To: Peter Xu <peterx@redhat.com>
Cc: kwolf@redhat.com, pbonzini@redhat.com, qemu-devel@nongnu.org,
qemu-block@nongnu.org, armbru@redhat.com
Subject: Re: [Qemu-devel] [PATCH 1/2] block/qapi: make two printf() formats literal
Date: Mon, 21 Mar 2016 15:14:48 -0600 [thread overview]
Message-ID: <56F06448.50308@redhat.com> (raw)
In-Reply-To: <20160310014625.GE4091@pxdev.xzpeter.org>
[-- Attachment #1: Type: text/plain, Size: 1974 bytes --]
On 03/09/2016 06:46 PM, Peter Xu wrote:
> On Wed, Mar 09, 2016 at 03:14:03PM -0700, Eric Blake wrote:
>>> + func_fprintf(f, "%*s[%i]:%c", indentation * 4, "", i,
>>> + composite ? '\n' : ' ');
>>
>> [The nerd in me wants to point out that you could avoid the ternary by
>> writing '"\n "[composite]', but that's too ugly to use outside of IOCCC
>> submissions, and I wouldn't be surprised if it (rightfully) triggers
>> clang warnings]
>
> Do you mean something like:
>
> int i = 0;
> printf("%c", '"\n "[i]');
You mean:
printf("%c", "\n "[i]);
(no ''). But with your declaration of 'i' as int, it is only defined if
i <= 2 (whereas in my example above, "\n "[composite] is always defined
because composite is bool rather than int).
>
> Is this a grammar btw?
Yes, C has an ugly grammar, because [] is just syntactic sugar for
deferencing pointer addition with nicer operator precedence. Quoting
C99 6.5.2.1:
"The definition of the subscript operator [] is that E1[E2] is identical
to (*((E1)+(E2))). Because of the conversion rules that apply to the
binary + operator, if E1 is an array object (equivalently, a pointer to
the initial element of an array object) and E2 is an integer, E1[E2]
designates the E2-th element of E1 (counting from zero)."
And a string literal is just a fancy way of writing the address of an
array of characters (where the address is chosen by the compiler).
Thus, it IS valid to dereference the addition of an integer offset with
the address implied by a string literal in order to obtain a character
within the string. And since the [] operator is commutative (even
though no one in their right mind commutes the operands), you can also
write the even-uglier:
composite["\n "]
But now we've gone far astray from the original patch review :)
--
Eric Blake eblake redhat com +1-919-301-3266
Libvirt virtualization library http://libvirt.org
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 604 bytes --]
next prev parent reply other threads:[~2016-03-21 21:14 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-03-09 5:56 [Qemu-devel] [PATCH 0/2] block/qapi: trivial fixes Peter Xu
2016-03-09 5:56 ` [Qemu-devel] [PATCH 1/2] block/qapi: make two printf() formats literal Peter Xu
2016-03-09 22:14 ` Eric Blake
2016-03-10 1:46 ` Peter Xu
2016-03-21 21:14 ` Eric Blake [this message]
2016-03-22 2:04 ` Peter Xu
2016-03-22 15:47 ` Markus Armbruster
2016-03-09 5:56 ` [Qemu-devel] [PATCH 2/2] block/qapi: fix unbounded stack for dump_qdict Peter Xu
2016-03-09 22:16 ` Eric Blake
2016-03-22 15:48 ` Markus Armbruster
2016-03-22 15:50 ` [Qemu-devel] [PATCH 0/2] block/qapi: trivial fixes Markus Armbruster
2016-03-22 16:27 ` Kevin Wolf
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=56F06448.50308@redhat.com \
--to=eblake@redhat.com \
--cc=armbru@redhat.com \
--cc=kwolf@redhat.com \
--cc=pbonzini@redhat.com \
--cc=peterx@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).