Deutsch   English   Français   Italiano  
<87a5db0ymo.fsf@nosuchdomain.example.com>

View for Bookmarking (what is this?)
Look up another Usenet article

Path: ...!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail
From: Keith Thompson <Keith.S.Thompson+u@gmail.com>
Newsgroups: comp.lang.c
Subject: Re: question about linker
Date: Wed, 04 Dec 2024 16:19:59 -0800
Organization: None to speak of
Lines: 152
Message-ID: <87a5db0ymo.fsf@nosuchdomain.example.com>
References: <vi54e9$3ie0o$1@dont-email.me>
	<877c8nt255.fsf@nosuchdomain.example.com>
	<viasv4$nm7q$2@dont-email.me> <vibr1l$vvjf$1@dont-email.me>
	<vic73f$1205f$1@dont-email.me> <20241129142810.00007920@yahoo.com>
	<vicfra$13nl4$1@dont-email.me> <20241129161517.000010b8@yahoo.com>
	<vicque$15ium$2@dont-email.me> <vid110$16hte$1@dont-email.me>
	<vifcll$1q9rj$1@dont-email.me> <vifiib$1s07p$1@dont-email.me>
	<87ldwx10gv.fsf@bsb.me.uk> <vimtt4$27vv$1@dont-email.me>
	<vin7r2$49d1$2@dont-email.me> <vinalt$5qoh$1@dont-email.me>
	<vipgns$rjqn$1@dont-email.me> <viqbl8$12mum$1@dont-email.me>
	<viqfuh$131h8$2@dont-email.me>
	<87ttbj12ec.fsf@nosuchdomain.example.com>
	<viqq95$164ug$1@dont-email.me>
MIME-Version: 1.0
Content-Type: text/plain
Injection-Date: Thu, 05 Dec 2024 01:20:00 +0100 (CET)
Injection-Info: dont-email.me; posting-host="7392a70ceafa2370b36a4bd73810300d";
	logging-data="1211084"; mail-complaints-to="abuse@eternal-september.org";	posting-account="U2FsdGVkX1+W2UQccYmA32httKJjzPWm"
User-Agent: Gnus/5.13 (Gnus v5.13)
Cancel-Lock: sha1:aaeHc0PU9ahHHgPFV7kMxk/XSXo=
	sha1:tiKeUyayRHfpL5ND41+qyPNYOy4=
Bytes: 7736

Bart <bc@freeuk.com> writes:
> On 04/12/2024 22:58, Keith Thompson wrote:
>> Bart <bc@freeuk.com> writes:
>>> OK, if it's so simple, explain it to me.
>> I'll pretend that was a sincere question.
>
> Let's put it this way: if somebody asked me what the rule was, I
> wouldn't be able to tell them.

Probably because there's no single rule.  As I wrote, "{" and "}"
are used in different contexts with different meanings.  (So are
"(", ")", ";", and "static".)  I have no particular expectation
that there should be a single rule covering all the cases, just
because they happen to use the same symbol.

A reasonable person would have ackowledged that I've at least tried
to answer your question.

>> You seem to be under the impression that a closing brace should
>> either always or never be followed by a semicolon.  I don't know
>> where you got that idea.
>> Braces ("{", "}") are used in different contexts with different
>> meanings.  They're generally used for some kind of grouping (of
>> statements, declarations, initializers), but the distinct uses are
>> distinct, and there's no particular reason for them to follow the
>> same rules.
>> 
>>> Apparently the first line here needs a semicolon after }, the second
>>> doesn't:
>>>
>>>    int X[1] = {0};
>>>    void Y() {}
>> Yes.  The first is a declaration, and a declaration requires a
>> semicolon.  I suppose the language could have a special-case rule
>> that if a declaration happens to end with a "}", the semicolon is
>> not required, but that would be silly.
>> The second is a function definition (and can only appear at file
>> scope).  Function definitions do not require or allow a semicolon
>> after the closing "}".  Why should they?
>
> Consistency? I posted a bit of Algol68 the other day; each function
> definition needed a semicolon, to separate it from the next.

C is not Algol68.  In C, the syntax of a function definition is such
that they can be appended without ambiguity.  Requiring a semicolon
after each definition would not help anything.  And it would break
most existing C code.

>>> Similarly here:
>>>
>>>    if (x) y;
>>>    if (x) {}
>>>
>>> Why?
>>>
>>> "Because that's what the grammar says" isn't a valid answer.
>> Because that's what the grammar says.
>> Not all statements require a closing semicolon.  In particular,
>> compound statements do not, likely because the closing
>> "}" unambiguously marks the end of the statement.  Sure, the
>> language could have been specified to require a semicolon, but why?
>
> Consistency again? But then you'd get this: if () {}; else {};. It
> would be incompatible with how it works now.

So there's a good reason for the current definition.

> So overall it's just messy. It works for BEGIN/END when semicolon is a
> separator, rather than a terminator. So you write END ELSE not END;
> ELSE.
>
> But because C uses ";" as a terminator, it's made a rod for its own back.

The solution (for programmers) is simple.  Don't add a ";" after the
closing "}" of a compound statement.  You *can* add the ";" in some
cases, but there's no point in doing so.

>> (I'll note that languages that use "begin"/"end" rather than "{"/"}"
>> often require a semicolon after the "end".)
>
> That's my A68 example.
>
>> And you can add a semicolon after a compound statement if you like
>> (it's a null statement),
>
> But not here I guess:  if () {}; else ...

You're right, I missed that case.

>> Of course you know all this.
>
> I'm aware of how messy and conistent it is. I've said that languages
> that use ";" as a separator probably fair better, but are still not
> ideal because the last statement of a block is now an annoying special
> case.

No, I'm saying that you already know what the rules are.  You have
access to multiple C (draft) standards and books.  You've written a C
compiler yourself.  I honestly don't believe you're as confused as you
pretend to be.

[...]

> Meanwhile, if I compile this:
>
>   void F(){}; void G(){};
>
> My compilers report a syntax error. But gcc passes it by default. So I
> take what the grammar says more seriously than gcc!
>
> IS ";" between function definitions legal or not? If not, then fail
> the program.

Bart, you already know that gcc by default is relatively lax, and is in
fact not a conforming C compiler, since it fails to produce many
required diagnostics.  You've been told again and again how to invoke
gcc so that it will at least attempt to be a conforming C compiler, for
any of several editions of the C standard.  But you still pretend that
gcc's default behavior says something about the C language.

>>> Please don't say the label is only defined to be a prefix to another
>>> statement. I asking why it was done like that.
>> The label is only defined to be a prefix to another statement.
>> It was simple to define it that way, and not particularly
>> inconvenient to add a semicolon if you happen to want a label at
>> the end of a block.  I'd be surprised if this rule has ever actually
>> caused you any inconvenience.
>
> I said that my generated code has to use ":;" after each label; it
> looks weird.

I stand corrected.  The rule has caused you some trivial inconvenience.
(Apparently you care about generated code looking weird; I'd expect
weirdness to be inevitable.)

>> But you'll be delighted to know that C23 changed the grammar for a
>> compound statement, so a label can appear before any of a statement,
>> a declaration, or the closing "}".  So now you have exactly what you
>> want.  (Just kidding; you'll still find a way to be angry about it.)
>
> No, that's amazing. Presumably, some people must complained about it
> (maybe it actually caused some inconvenience!), and it eventually got
> fixed.
>
> Of course, if it was just me, then it would be pointless ranting. 'How
> hard is to add the semicolon?'
>
> Well, 'How hard is it to delete the semicolon' from my above example?

-- 
Keith Thompson (The_Other_Keith) Keith.S.Thompson+u@gmail.com
void Void(void) { Void(); } /* The recursive call of the void */