9fans - fans of the OS Plan 9 from Bell Labs
 help / color / mirror / Atom feed
From: erik quanstrom <quanstro@quanstro.net>
To: 9fans@9fans.net
Subject: Re: [9fans] kenc: casting expression to void not ignored
Date: Sun, 29 Jun 2008 10:18:25 -0400	[thread overview]
Message-ID: <d4ce40f4e6116bd069840b25586066c2@quanstro.net> (raw)
In-Reply-To: <A14B2B45-67BD-4E40-B056-68EF3CAA687F@mac.com>

> Hello. I have a simple push macro for a stack machine interpreter. It
> looks like this:
>
> 	#define push(s) ((void)(((stackptr >= (stack + stacksize)) ?
> growstack() : (void)0), (*stackptr++ = errcheck(s))))
>
> Does this boggle the mind? It's very simple: it checks for stack
> overflow and makes the stack bigger if so, then checks to see if s, a
> double, is NaN or ±Inf, and finally pushes it onto the stack if not
> (errcheck calls longjmp - how I wish I had try).
>
> However, when I use the push macro, I get tons of warnings like this:
>
> 	warning: run.c:170 result of operation not used
>
> Shouldn't the cast to void mean that I don't intend to use the result
> of the operation? Thanks.

no.  USED(x) where x is a variable name means you do not intend to use
the result of the operation. why don't you write push like this instead?

void
push(Whatever *s)
{
	if(stackptr >= stack + stacksize)
		growstack();
	*stackptr++ = errcheck(s)
}

this eliminates two wierd void casts, a ternary operator,
a comma operator and your warning.  i find it
difficult to imagine that a function call would be significant
overhead in this case.

on the certainly wrong assumption that the function call
needs to be avoided, there's no rule that one can't use if
statements in macros:

#define push(s)\
	do {\
		if(stackptr >= stack + stacksize)\
			growstack;\
		*stackptr++ = errcheck(s);\
	} while(0)

but for pete's sake, use a function until you know it's
too slow.

- erik




  parent reply	other threads:[~2008-06-29 14:18 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-06-29 13:53 Pietro Gagliardi
2008-06-29 13:57 ` Pietro Gagliardi
2008-06-29 14:18 ` erik quanstrom [this message]
2008-06-29 15:28 ` Rob Pike

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=d4ce40f4e6116bd069840b25586066c2@quanstro.net \
    --to=quanstro@quanstro.net \
    --cc=9fans@9fans.net \
    /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).