Sujet : Re: C23 auto x C++ auto.
De : david.brown (at) *nospam* hesbynett.no (David Brown)
Groupes : comp.lang.cDate : 26. May 2024, 17:10:32
Autres entêtes
Organisation : A noiseless patient Spider
Message-ID : <v2vmto$3ffl2$1@dont-email.me>
References : 1 2
User-Agent : Mozilla Thunderbird
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.