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);