Path: csiph.com!1.us.feeder.erje.net!feeder.erje.net!news.misty.com!news.iecc.com!.POSTED.news.iecc.com!nerds-end From: Kaz Kylheku <864-117-4973@kylheku.com> Newsgroups: comp.compilers Subject: Re: another C-like language? was Compilers :) Date: Mon, 9 Jan 2023 17:41:51 -0000 (UTC) Organization: A noiseless patient Spider Sender: news@iecc.com Approved: comp.compilers@iecc.com Message-ID: <23-01-029@comp.compilers> References: <23-01-001@comp.compilers> <23-01-002@comp.compilers> <23-01-003@comp.compilers> <23-01-008@comp.compilers> <23-01-016@comp.compilers> Injection-Info: gal.iecc.com; posting-host="news.iecc.com:2001:470:1f07:1126:0:676f:7373:6970"; logging-data="32133"; mail-complaints-to="abuse@iecc.com" Keywords: C, design Posted-Date: 09 Jan 2023 21:34:36 EST X-submission-address: compilers@iecc.com X-moderator-address: compilers-request@iecc.com X-FAQ-and-archives: http://compilers.iecc.com Xref: csiph.com comp.compilers:3297 On 2023-01-06, David Brown wrote: > don't want to go through them all, but I agree with you that the style > of "all your declarations at the start of the function" is long > outdated, and often - but not universally - considered a bad idea.) Declarations have never been required to be at the top of a function in C, because they can be in any compound statement block. I think that goes all the way back to the B language. [Nope, see the next message. -John] The "Variables at the top" meme may be something coming from Pascal. IIRC, in Pascal, compound statements aren't full blocks; they cannot have VAR declarations. When programmers abandoned Pascal in the 1980s, they carried over this habit into C. I hate mixed declarations and code because it's almost sa bad as variables-at-the-top. The scope of a declaration that is just planted into the middle of a compound statement block extends all the way to the end of the block. There should be a smaller enclosing block which exactly delimits the scope of that variable. If some variable is used over seven lines of a 300 line function, those seven lines should ideally be enclosed in curly braces, so the variable is not known outside of those lines. Just planting an unwrapped declaration of the variable at the function scope level (outermost block) solves only half the problem. The scope of the variable starts close to where the variable is used, which is good; but it still goes to the end of the function, way past its actual semantic scope that ends at the last use. A block like this can be repeated with copy and paste: { int yes = 1; setsockopt(fd, SO_WHATEVER, &yes); } This cannot: you will get redefinition errors: int yes = 1; setsockopt(fd, SO_WHATEVER, &yes); you have to think about ensuring that "int yes" occurs in one place that is before the first use, and the other places assign to it. Or invent different names. -- TXR Programming Language: http://nongnu.org/txr Cygnal: Cygwin Native Application Library: http://kylheku.com/cygnal Mastodon: @Kazinator@mstdn.ca