Path: news.eternal-september.org!eternal-september.org!feeder3.eternal-september.org!news.quux.org!news.nk.ca!rocksolid2!i2pn2.org!.POSTED!not-for-mail From: Richard Damon Newsgroups: comp.lang.c Subject: Re: Regarding assignment to struct Date: Sat, 3 May 2025 21:42:37 -0400 Organization: i2pn2 (i2pn.org) Message-ID: <3fd0dce206153c0d2dc7cf26291165c3381e9bc2@i2pn2.org> References: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Injection-Date: Sun, 4 May 2025 01:44:56 -0000 (UTC) Injection-Info: i2pn2.org; logging-data="3031557"; mail-complaints-to="usenet@i2pn2.org"; posting-account="diqKR1lalukngNWEqoq9/uFtbkm5U+w3w6FQ0yesrXg"; User-Agent: Mozilla Thunderbird Content-Language: en-US In-Reply-To: X-Spam-Checker-Version: SpamAssassin 4.0.0 On 5/2/25 2:34 PM, Lew Pitcher wrote: > Back in the days of K&R, Kernighan and Ritchie published an addendum > to the "C Reference Manual" titled "Recent Changes to C" (November 1978) > in which they detailed some differences in the C language post "The > C Programming Language". > > The first difference they noted was that > "Structures may be assigned, passed as arguments to functions, and > returned by functions." > > From what I can see of the ISO C standards, the current C language > has kept these these features. However, I don't see many C projects > using them. > > I have a project in which these capabilities might come in handy; has > anyone had experience with assigning to structures, passing them as > arguments to functions, and/or having a function return a structure? > > Would code like > struct ab { > int a; > char *b; > } result, function(void); > > if ((result = function()).a == 10) puts(result.b); > > be understandable, or even legal? > > I will say that I have used the feature, but in very limited conditions, mostly where the structure is no bigger than one or two typical words. It could be a structure with a bitfield to make accesses clearer than low level masking, or for a "point" with x and y tied into one object. Bigger than that, and you likely want to pass the object by address, not by value, passing just a pointer to it.