Deutsch   English   Français   Italiano  
<v2vohg$3fq60$1@dont-email.me>

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

Path: ...!weretis.net!feeder9.news.weretis.net!feeder8.news.weretis.net!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail
From: Thiago Adams <thiago.adams@gmail.com>
Newsgroups: comp.lang.c
Subject: Re: C23 auto x C++ auto.
Date: Sun, 26 May 2024 13:38:08 -0300
Organization: A noiseless patient Spider
Lines: 85
Message-ID: <v2vohg$3fq60$1@dont-email.me>
References: <v2vela$3e4pn$1@dont-email.me>
 <v2vgj3$3eh79$1@raubtier-asyl.eternal-september.org>
 <v2vmto$3ffl2$1@dont-email.me>
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit
Injection-Date: Sun, 26 May 2024 18:38:08 +0200 (CEST)
Injection-Info: dont-email.me; posting-host="b36d0c53be6e431910f898a3cb57d404";
	logging-data="3664064"; mail-complaints-to="abuse@eternal-september.org";	posting-account="U2FsdGVkX18eS0C0nvAJeiiphOB3kGKfospNh2i9Q/w="
User-Agent: Mozilla Thunderbird
Cancel-Lock: sha1:ZiY3fok8/V3rvrS2EPx8H9H0xV8=
Content-Language: en-GB
In-Reply-To: <v2vmto$3ffl2$1@dont-email.me>
Bytes: 3609

Em 5/26/2024 1:10 PM, David Brown escreveu:
> On 26/05/2024 16:22, Bonita Montero wrote:
>> Am 26.05.2024 um 15:49 schrieb Thiago Adams:
>>> I think most people is not aware of this:
>>>
>>>  From 3096 C23 draft
>>>
>>> "
>>> 6.7.9 Type inference
>>> ...
>>>   2 For such a declaration that is the definition of an object the 
>>> init-    declarator shall have the form
>>>
>>>     direct-declarator = assignment-expression
>>> "
>>>
>>> Basically "direct-declarator" differs from "declarator" because it 
>>> does not contains pointer.
>>>
>>> Then the type inference using auto and pointer is something undefined 
>>> in C23.
>>>
>>> struct node{
>>>      struct node * next;
>>>
>>> };
>>> int main(){
>>>     struct node node = {};
>>>     auto * p = node.next;
>>> }
>>>
>>> <source>:7:4: error: 'auto' requires a plain identifier, possibly 
>>> with attributes, as declarator
>>>      7 |    auto * p = node.next;
>>>        |    ^~~~
>>>
>>> This differs from C++.
>>>
>>>
>>
>> I don't know what type inference in C is good for since the type names
>> in C are usually short. If I have short typenames in C++ I don't use
>> type inference. Type-inference makes sense to make such things shorter
>>      typename map<string, string>::const_iterator it = map.cbegin();
>> This doesn't happen in C.
>>
> 
> "typeof" and "auto" have been available forever as gcc extensions (where 
> "auto" was spelt "__auto_type", since of course "auto" had another 
> meaning in C until C23).  One use-case for C is in macros that handle 
> multiple types, but I expect people have done other things with them too.
> 
> It would have been nice to see statement expressions included in C23, as 
> they have been in gcc for ages:
> 
> #define max(a,b) \
>    ({ __auto_type _a = (a); \
>        __auto_type _b = (b); \
>      _a > _b ? _a : _b; })
> 
> 
> In general, it's just another tool that could be useful in writing code 
> that's a bit more flexible.
> 

I am trying to remember the situation where typeof cannot be used, 
justifying the existence of auto other than "easy to read".


  #define max(a,b) \
     ({ typeof(a) _a = (a); \
         typeof(a) _b = (b); \
       _a > _b ? _a : _b; })

I think for function calls typeof can be a little confusing because the 
arguments.

typeof(f(arg1, arg2)) r = f(arg1, arg2);
auto r = f(arg1, arg2);