public inbox for linux-8086@vger.kernel.org
 help / color / mirror / Atom feed
From: mjn3@codepoet.org (Manuel Novoa III)
To: Riley Williams <Riley@Williams.Name>
Cc: Robert de Bath <robert$@mayday.cix.co.uk>,
	Linux-8086 <linux-8086@vger.kernel.org>
Subject: Re: C compiler, assembler and linker
Date: Mon, 22 Jul 2002 18:58:21 -0600	[thread overview]
Message-ID: <20020723005821.GB9657@codepoet.org> (raw)
In-Reply-To: <Pine.LNX.4.21.0207230104510.4272-100000@Consulate.UFP.CX>

Riley,

On Tue, Jul 23, 2002 at 01:34:21AM +0100, Riley Williams wrote:
> Hi Robert, Manuel.
> 
> >> 1) #elif support.
> 
> > Okay, reasonable.
> 
> I haven't had a chance to look at this yet, so this comment is probably
> irrelevant, but...does this support handle the following correctly?
> 
> 	#define MODE1
> 	#define MODE3
> 
> 	#ifdef MODE1
> 	#  ifdef DEBUG
> 	#    define DBGMODE 1
> 	#  endif
> 	#elifdef MODE2
> 	#  define DBGMODE 2
> 	#elifdef MODE3
> 	#  define DBGMODE 3
> 	#else
> 	#  define DBGMODE 4
> 	#endif
> 
> 	#ifndef DBGMODE
> 	#  define DBGMODE 0
> 	#endif
> 
> With at least one C compiler I've used over the years, DBGMODE ended up
> with the value 3 rather than the value 1 that it should have in that case.

I just tested.  Changing #elifdef to #elif defined( ), it gives
0 if DEBUG isn't defined, and 1 if DEBUG is defined.

> >> 4) Limited support for things like "#define stdio stdio". Stock bcc
> >>    goes into an infinite loop when encounting this. The implementation
> >>    has flaws, but it does what I needed. You see this a lot in the
> >>    glibc headers we're using with uClibc (yes I'm working on a port).
> 
> One obvious optimisation is this: Where a #define has the same value for
> its value as its name, the entire #define is treated as a comment. That
> would deal with the above define, but could have problems with...
> 
> 	#define stdio (stdio)
> 
> ...which probably also fails with the old system.

Treating the define as a comment wouldn't work, as all the subsequent
#ifdef stdio tests would fail.

> > I don't like the way this is done; I think it'd be better to
> > 'smudge' the definition of the current macro so that the search
> > can't find the word for recursion.
> 
> When are macros expanded? If they are expanded as they are met in the
> code, the above can't cause a problem as the macro isn't defined until
> after the value has been expanded. However, if the preprocessor reaps
> all the macros and then expands them in a separate pass, recursion
> problems are inevitable.
> 
> As an example of this, how is the following code handled?
> 
> 	int main()
> 	{
> 		int VALUE = 7;
> 
> 	#define VALUE 12
> 
> 		printf("Test 1 = %d\n", VALUE );
> 
> 	#undef VALUE
> 
> 		printf("Test 2 = %d\n", VALUE );
> 		exit(0);
> 	}
> 
> Whilst not good coding, that code is perfectly valid K&R C but any
> compiler that first reaps the #define/#undef statements and expands the
> macros in a separate pass can produce faulty code in two different ways,
> and can fail to compile in two other ways...

Preprocessor output:

int main()
{
int VALUE = 7;


printf("Test 1 = %d\n",12 );


printf("Test 2 = %d\n",VALUE );
exit(0);
}

Manuel

  reply	other threads:[~2002-07-23  0:58 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2002-07-14 14:05 C compiler, assembler and linker Harry Kalogirou
2002-07-14 17:27 ` Manuel Novoa III
2002-07-15  6:07   ` Riley Williams
2002-07-15 17:02     ` Manuel Novoa III
2002-07-15 19:13       ` Riley Williams
2002-07-15 22:02         ` Manuel Novoa III
2002-07-16  6:27           ` Riley Williams
2002-07-17  1:31             ` Manuel Novoa III
2002-07-17  6:33               ` Riley Williams
2002-07-18 12:03                 ` Minix vs. ELKS Feher Tamas
2002-07-18 12:27                   ` Javier Sedano
2002-07-02 15:07                     ` (unknown) Miguel A. Bolanos
2002-07-18 13:40                   ` Minix vs. ELKS Alan Cox
2002-07-22 21:41                 ` C compiler, assembler and linker Robert de Bath
2002-07-23  8:16               ` Robert de Bath
2002-07-23 16:25                 ` Manuel Novoa III
2002-07-23 19:09                   ` Robert de Bath
2002-07-24 21:17         ` More dev86 changes (0.16.5) Robert de Bath
2002-07-24 22:02           ` Riley Williams
2002-07-25 15:42             ` Manuel Novoa III
2002-07-26  7:55               ` Robert de Bath
2002-07-26 15:12                 ` Manuel Novoa III
2002-07-26  8:22             ` Robert de Bath
2002-07-24 22:26           ` Paul Nasrat
2002-07-25 16:34             ` Manuel Novoa III
2002-07-22 23:26       ` C compiler, assembler and linker Robert de Bath
2002-07-23  0:34         ` Riley Williams
2002-07-23  0:58           ` Manuel Novoa III [this message]
2002-07-23  0:46         ` Manuel Novoa III
  -- strict thread matches above, loose matches on Subject: below --
2002-07-15 14:16 Ken Martwick
2002-07-15 19:21 ` Riley Williams

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=20020723005821.GB9657@codepoet.org \
    --to=mjn3@codepoet.org \
    --cc=Riley@Williams.Name \
    --cc=linux-8086@vger.kernel.org \
    --cc=robert$@mayday.cix.co.uk \
    /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