Deutsch   English   Français   Italiano  
<vt6gp0$16ejo$1@dont-email.me>

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

Path: ...!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!eternal-september.org!.POSTED!not-for-mail
From: bart <bc@freeuk.com>
Newsgroups: comp.lang.c
Subject: Re: "A diagram of C23 basic types"
Date: Wed, 9 Apr 2025 20:11:28 +0100
Organization: A noiseless patient Spider
Lines: 105
Message-ID: <vt6gp0$16ejo$1@dont-email.me>
References: <87y0wjaysg.fsf@gmail.com> <vsj1m8$1f8h2$1@dont-email.me>
 <vsj2l9$1j0as$1@dont-email.me> <vsjef3$1u4nk$1@dont-email.me>
 <vsjg6t$20pdb$1@dont-email.me> <vsjgjn$1v1n4$1@dont-email.me>
 <vsjk4k$24q5m$1@dont-email.me> <vsjlcp$230a5$1@dont-email.me>
 <vsjmdl$277bk$1@dont-email.me> <VsdHP.1828827$TBhc.1078002@fx16.iad>
 <vskjlo$34st8$1@dont-email.me> <20250402220614.431@kylheku.com>
 <85mscxlqnb.fsf@nosuchdomain.example.com> <vsl9sn$3vdjj$2@dont-email.me>
 <20250403121946.134@kylheku.com> <vsms75$1i8ud$1@dont-email.me>
 <vsnhq6$291i3$4@dont-email.me> <20250409124900.00000fa1@yahoo.com>
 <vt5r34$inuo$7@dont-email.me> <vt6an7$13tvo$1@dont-email.me>
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit
Injection-Date: Wed, 09 Apr 2025 21:11:29 +0200 (CEST)
Injection-Info: dont-email.me; posting-host="86cd0c292c528f4b59336ead25869004";
	logging-data="1260152"; mail-complaints-to="abuse@eternal-september.org";	posting-account="U2FsdGVkX18qPmtnAqOwNI3g23QOXhM5"
User-Agent: Mozilla Thunderbird
Cancel-Lock: sha1:fqQBQX+l0mew6zjktM5Mkm6mqfU=
Content-Language: en-GB
In-Reply-To: <vt6an7$13tvo$1@dont-email.me>
Bytes: 5007

On 09/04/2025 18:26, BGB wrote:
> On 4/9/2025 8:01 AM, David Brown wrote:
>> On 09/04/2025 11:49, Michael S wrote:
>>> On Fri, 4 Apr 2025 02:57:10 -0000 (UTC)
>>> Lawrence D'Oliveiro <ldo@nz.invalid> wrote:
>>>
>>>> On Thu, 3 Apr 2025 21:48:40 +0100, bart wrote:
>>>>
>>>>> Commas are overwhelmingly used to separate list elements in
>>>>> programming languages.
>>>>
>>>> Not just separate, but terminate.
>>>
>>> I disagree. I am in favor of optional trailing commas rather than
>>> mandatory ones.
>>
>> I am certainly in favour of them for things like initialiser lists and 
>> enum declarations.
>>
>>>
>>>> All the reasonable languages allow
>>>> trailing commas.
>>>
>>> Are your sure that C Standard does not allow trailing commas?
>>> That is, they are obviously legal in initializer lists.
>>> All compilers that I tried reject trailing comma in function calls.
>>>
>> ...
>>> But is it (rejection) really required by the Standard? I don't know.
>>>
>>>
>>
>> Yes.  The syntax (in 6.5.2p1) is :
>>
>> postfix-expression:
>>      ...
>>      postfix-expression ( argument-expression-list opt )
>>      ...
>>
>> argument-expression-list :
>>      argument-expression
>>      argument-expression-list , argument-expression
>>
>>
>>
>> I don't think it is unreasonable to suggest that it might be nice to 
>> allow a trailing comma, at least in variadic function calls, but the 
>> syntax of C does not allow it.
>>
> 
> Yeah, pretty much.
> 
> 
> It might have also been interesting if C allowed optional named arguments:
> int foo(int x=3, int y=4)
> {
>    return x+y;
> }
> 
> foo() => 7
> foo(.y=2) => 5
> 
> Likely would be following any fixed arguments (if present), and likely 
> (for sake of implementation sanity) named arguments and varargs being 
> mutually exclusive (alternative being that named arguments precede 
> varargs if both are used).
> 
> Well, at least ".y=val" as "y: val" likely wouldn't go over well even if 
> it is what several other languages with this feature used (well or, 
> "y=val", which is used in some others).
> 
> In the most likely case, the named argument form would be transformed 
> into the equivalent fixed argument form at compile time.
>    So: "foo(.y=2)" would be functionally equivalent to "foo(3,2)".

There are all sorts of problems in adding this to C. For example, this 
is legal:

   void F(int a, float b, char* c);
   void F(int c, float a, char* b);
   void F(int b, float c, char* a) {}

The sets of parameter names are all different (and that's in the same 
file!); which is the official set?

Another is to do with defining default values (essential if named 
arguments are to be fully used). First, similar thing to the above:

   void F(int a = x + y);
   void F(int a = DEFAULT);

Which expression is to be used? Another is:

   void F(int a = x + y);
   ...
   void F(int a = x + y);

The names 'x' and 'y' would normally refer to whatever x/y names are in 
scope at the declaration site. But if multiple declarations exist at 
different locations, different x/y could be visible; which will be used?

Usually it is not meaningful to have x/y be the names in scope at the 
call-site; the author of the function will have no idea which x/y names 
will have in scope, if there are any at all.